私は、row.xmlファイルを使用して作成されたカスタムリストビューを作成しました。各行には2つのTextViewとImageViewが含まれています。私はJSONファイルからTextViewを作成しますが、これはうまくいきますので、これを無視しても問題ないと思いますので、SharedPreferencesに基づいてImageViewを作成します。Androidリストビューリサイクラが怒ったり、失敗したりしますか?
基本的には、誰かがリストビュー内の行をクリックすると、関連するアクティビティが正常に完了すると、SharedPreferencesに通知した後、ユーザーがリストに戻ると、スイッチ/ケースがSharedPreferencesファイルを読み込み、その特定の行のImageViewを更新し、緑色のアイコンを表示します。ユーザーがアクティビティに失敗すると、その行のImageViewに赤いアイコンが表示されます。リスト内の最初に完了していないアクティビティの横に青いアイコンが表示されます。
これは、ViewフォーメーションループのSharedPreferencesに対してswitch/caseコマンドを実行することで行います。
私の問題:私はリストを開いて、すべて正常に動作します。リストには、期待どおりに1つの青いアイコンが表示されます。私が下にスクロールすると、青いアイコンがさらに下に表示されます。そこにはいけません。 OK、あなたは "あなたがあなたのコーディングをF ** kedした"と思っています。しかし、リストをスクロールすると、青色のアイコンが、期待されるリスト項目から下の項目に「ジャンプ」したことがわかります。私は再び下にスクロールし、青色のアイコンが倍増していることを確認します。2つの異なる行に2つあります。以前は存在しませんでした。だから私は仕事を完了しました。緑色のアイコンが表示されます。私は数回上下にスクロールし、突然、異なるリスト行の隣に3-4の緑のアイコンが表示されます。
私の推測は、リサイクラが怒鳴っているということだけです。私は正しい?これを解決するために何かできることはありますか?私は卑劣なことにしようとしました - 私は 'setVisibility-GONE'をimageviewが必要でない行に使用しました...スクロールした後に、そこには - それは恐らく緑色で、
public class MainList extends ListActivity {
static SharedPreferences statusSettings;
String jsonString;
static JSONObject json;
static JSONArray arrayTest;
static int bob = 3;
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
try {
JSONObject e = arrayTest.getJSONObject(position);
Intent intent = new Intent();
intent.putExtra("clientName", e.getString("proj_name"));
intent.putExtra("clientAddress", e.getString("c_address"));
intent.putExtra("clientComments", e.getString("comments"));
intent.putExtra("clientOrder", e.getString("order"));
intent.setClass(MainList.this, ClientDetails.class);
MainList.this.startActivity(intent);
} catch (JSONException e) {
// TODO Auto-generated catch block
Log.e("JSON", "Problem creating object from array!");
e.printStackTrace();
}
}
private static class EfficientAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public EfficientAdapter(Context context) {
// Cache the LayoutInflate to avoid asking for a new one each time.
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return arrayTest.length();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid unneccessary calls
// to findViewById() on each row.
ViewHolder holder;
// When convertView is not null, we can reuse it directly, there is no need
// to reinflate it. We only inflate a new View when the convertView supplied
// by ListView is null.
if (convertView == null) {
convertView = mInflater.inflate(R.layout.mainlist, null);
// Creates a ViewHolder and store references to the two children views
// we want to bind data to.
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.ivMainIcon);
holder.textName = (TextView) convertView.findViewById(R.id.tvMainName);
holder.textAddress = (TextView) convertView.findViewById(R.id.tvMainAddress);
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}
// Bind the data efficiently with the holder.
JSONObject e;
try {
e = arrayTest.getJSONObject(position);
holder.textName.setText(e.getString("proj_name"));
holder.textAddress.setText(e.getString("c_address"));
switch (statusSettings.getInt(e.getString("order"), 0)){
case 1:
holder.icon.setVisibility(View.INVISIBLE);
break;
case 2:
if(bob == 3){
holder.icon.setImageResource(R.drawable.next_delivery);
bob = 5;
}
break;
case 3:
holder.icon.setImageResource(R.drawable.delivered_icon);
break;
case 4:
holder.icon.setImageResource(R.drawable.undelivered_icon);
break;
}
} catch (JSONException e1) {
// TODO Auto-generated catch block
Log.e("JSON", "Couldn't put one of JSON arrays into object");
e1.printStackTrace();
}
return convertView;
}
static class ViewHolder {
ImageView icon;
TextView textName;
TextView textAddress;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
jsonString = getIntent().getExtras().getString("jsonString");
try {
json = new JSONObject(jsonString);
arrayTest = json.getJSONArray("client_list");
} catch (JSONException e) {
// TODO Auto-generated catch block
Log.e("JSON", "Couldn't create the JSON Array");
e.printStackTrace();
}
setListAdapter(new EfficientAdapter(this));
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
bob = 3;
statusSettings = getSharedPreferences("status", 0);
setListAdapter(new EfficientAdapter(this));
}
}
ご協力いただければ幸いです。
/編集:場合には、あなたがそれを必要とする - ここrow.xmlファイルです:まだボブと中途半端ソリューションを使用して...スイッチ/ケース(ブリガムの礼儀)を更新しました
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/LinearLayout02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
<TextView
android:id="@+id/tvMainName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="Large Text"
android:textColor="#FFFFFF"
android:textSize="25dp" />
<ImageView
android:id="@+id/ivMainIcon"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_gravity="bottom"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp"
android:layout_weight="0"
android:scaleType="fitXY" />
</LinearLayout>
<TextView
android:id="@+id/tvMainAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="5dp"
android:text="TextView"
android:textSize="15dp" />
</LinearLayout>
変数。それはあなたのcase 2
で
switch (statusSettings.getInt(e.getString("order"), 0)){
case 1:
holder.icon.setVisibility(View.INVISIBLE);
break;
case 2:
if(bob.toString().equalsIgnoreCase("do it") || bob.toString().equalsIgnoreCase(e.getString("proj_name"))){
holder.icon.setVisibility(View.VISIBLE);
holder.icon.setImageResource(R.drawable.next_delivery);
bob = e.getString("proj_name");
}else{
holder.icon.setVisibility(View.INVISIBLE);
}
break;
case 3:
holder.icon.setVisibility(View.VISIBLE);
holder.icon.setImageResource(R.drawable.delivered_icon);
break;
case 4:
holder.icon.setVisibility(View.VISIBLE);
holder.icon.setImageResource(R.drawable.undelivered_icon);
break;
default:
holder.icon.setVisibility(View.INVISIBLE);
break;
}
convertViewは毎回nullになりますか? ViewHolderを取り除き、RelativeLayoutを直接使用して戻そうとしましたか? statusSettings.getInt(e.getString( "order")、0)は常に異なる値を返しますか?あなたのrow.xmlはどのように見えますか?ありがとうございました。 –
convertViewについてわからないし、RelativeLayoutを試したこともありません。私はまだ学習のノブですので、そのことがどのように行われているかを調べる必要があります。 2 = "前のアクティビティは完了しましたが、まだ完了していません" 3 = "完了していません"成功しました」と4 =「失敗しました」 これはボブの理由です - 青いアイコンを表示するケースが2つしかないようにしたいのです – Wildblood