2012-02-02 11 views
0

私は、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; 
      } 
+0

convertViewは毎回nullになりますか? ViewHolderを取り除き、RelativeLayoutを直接使用して戻そうとしましたか? statusSettings.getInt(e.getString( "order")、0)は常に異なる値を返しますか?あなたのrow.xmlはどのように見えますか?ありがとうございました。 –

+0

convertViewについてわからないし、RelativeLayoutを試したこともありません。私はまだ学習のノブですので、そのことがどのように行われているかを調べる必要があります。 2 = "前のアクティビティは完了しましたが、まだ完了していません" 3 = "完了していません"成功しました」と4 =「失敗しました」 これはボブの理由です - 青いアイコンを表示するケースが2つしかないようにしたいのです – Wildblood

答えて

1

を!:なければならないように、少なくともすべてが機能するようになりました、あなただけのbob == 3場合の画像を設定します。 bob != 3の場合、else節を追加して画像を非表示にする必要があります。また、switchステートメントの前にアイコンを表示するように設定しておく必要があります。ほとんどのケースでは、このステートメントを表示する必要があるためです。

また、switch文にデフォルトの大文字小文字を追加することを検討する必要があります。

 holder.icon.setVisibility(View.VISIBLE); 
     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; 
       } else { 
        holder.icon.setVisibility(View.INVISIBLE); 
       } 
       break; 
      case 3: 
       holder.icon.setImageResource(R.drawable.delivered_icon); 
       break; 
      case 4: 
       holder.icon.setImageResource(R.drawable.undelivered_icon); 
       break; 
      default: 
       holder.icon.setVisibility(View.INVISIBLE); 
       break; 
     } 
+0

緑色と赤色のアイコン私はスクロールするとリサイクラーによってビューが動的に作成されると仮定しているので、bob = 3と表示され、next_deliveryアイコンを表示し、bobを5に変更します。ボブはもはや3ではないので、アイコンをもう一度表示しないで表示を破棄します。私は私の論理を再考する必要があり、その半分の解決策の代わりに真剣にする必要があります。なぜ緑と赤のアイコンが倍増していた...それは私の頭をしている! – Wildblood

+0

右...私はハーフアシストのソリューションを修正しましたので、より複雑ではありますが、もはや堂々とした、ハーフアシストのソリューションはありません。アプリは意図したとおりに動作しています - ありがとう! – Wildblood

+2

リサイクルされたビューを使用する場合は、ビューのすべてのフィールドをリセットする必要があります。そうしないと、以前のビューのアーチファクトが表示されているようにポップアップしてしまいます。 – Brigham

0

リサイクラを無効にすることもできます。あなたはそれをしたくないかもしれませんが、convertView == nullとelseステートメントを削除するだけです。これによりアーティファクトのリサイクルが中止されます。

関連する問題