2012-08-19 7 views
5

を繰り返します。だから、:Androidのカスタムリストビューは、私は、カスタムアダプタを持っている選択の背景

lview1 = (ListView) findViewById(R.id.listViewPhrase); 
    adapter = new PhraseCustomAdapter(this, original, translation, transcription); 
    lview1.setAdapter(adapter); 
    lview1.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
    lview1.setMultiChoiceModeListener(new MultiChoiceModeListener() { 

     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, 
               long id, boolean checked) { 
      View view; 
      if (checked){ 
       Log.v ("checked?", "YES"); 
       Log.v ("Position", Integer.toString(position)); 

       view = lview1.getChildAt(position); 
       view.setBackgroundColor(Color.LTGRAY); 


       original_list.add (adapter.getItemOriginal(position)); 
       translation_list.add (adapter.getItemTranlation(position)); 
       transcription_list.add (adapter.getItemTranscription(position)); 

       countSelected += 1; 
      } 
      if (!checked){ 
       Log.v ("checked?", "NO"); 
       Log.v ("Position", Integer.toString(position)); 


       for (int i = 0; i < original_list.size(); i++) 
       { 
        if (original_list.get(i) == adapter.getItemOriginal(position)){ 
         original_list.remove (i); 
         translation_list.remove (i); 
         transcription_list.remove (i); 
        } 
       } 
       countSelected -= 1; 
      } 


      mode.setTitle(Integer.toString(countSelected) + " " + getString(R.string.selectItem)); 
     } 

は問題がある:私は長押しのアイテム(例えば、最初の項目)、第七項目が(背景を変更することで)あまりにも強調表示されたとき。強調表示されている7番目の項目を「強調表示しない」ようにすると、アプリがクラッシュします。最新のアイテムをクリックしようとすると、アプリがクラッシュします。 私はビューのレンダリング方法についていくつかの記事を読んで、アイテムをリサイクル、私は

UPD私の問題のためにあらゆる可能な解決策を知らないています

V/checked?(24966): YES 
V/Position(24966): 7 
Shutting down VM 
threadid=1: thread exiting with uncaught exception (group=0x2b542210) 
AndroidRuntime(24966): FATAL EXCEPTION: main 
java.lang.NullPointerException 
at com.alextee.phrases.PhraseActivity$1.onItemCheckedStateChanged(PhraseActivity.java:145) 
at android.widget.AbsListView$MultiChoiceModeWrapper.onItemCheckedStateChanged(AbsListView.java:5688) 
at android.widget.AbsListView.performItemClick(AbsListView.java:1040) 
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2522) 
at android.widget.AbsListView$1.run(AbsListView.java:3183) 
at android.os.Handler.handleCallback(Handler.java:605) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
android.app.ActivityThread.main(ActivityThread.java:4441) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 
+0

あなたはのLogCatのスタックトレースを投稿することができます7番目のアイテムのハイライトを解除するとアプリがクラッシュする – tolgap

+0

投稿の最後に追加されました。 –

答えて

10

リストビュー自体は複雑でリサイクルもあります。リストビューのアンドロイドデベロッパーの動画を見ると、リストビューのリサイクルとその問題について詳しく知ることができます。
あなたのアプリの問題はリストビューのリサイクルによるものです。
クリックするか長いをクリックするとリスト項目の背景を変更すると背景が変わり、この項目をデバイスの表示領域からスクロールすると、この項目に添付されたビューはリサイクルされ、他のリスト項目に割り当てられます現在表示されています。だから、その項目も強調表示されます。
リストビューにonItemClickListener設定し

  • :あなたは次の操作を行う必要があり、リストビュー内の項目を強調表示するために

    enter image description here



    この写真は、リストビューのリサイクルについて説明します。

  • onItemClick()メソッドでは、ビューの背景を変更し、現在の強調表示された位置をリストビューに保存し、リストアダプタのnotifyDataSetChanged()を呼び出します。 notifyDataSetChanged()を呼び出すことは、現在表示されている項目を再描画するので重要です。

    grid[pos].setOnItemClickListener(new OnItemClickListener() { 
          @Override 
          public void onItemClick (AdapterView<?> parent, 
            View v, int position, long Id) 
          { 
            highlighted = position; //highlighted is a global variable 
            //container is the root view of the list row layout 
            LinearLayout container = (LinearLayout)v.findViewById(R.id.container); 
            container.setBackgroundResource(R.drawable.highlighted_backg); 
            mListAdapter.notifyDataSetChanged(); 
    
          } 
        }); 
    

    getViewメソッド()メソッドは次のように実装する必要があります:

コードリストについてonItemClickは次のようなものでなければなりません

public View getView (int position, View convertView, ViewGroup parent) 
{ 
    ViewHolder holder; 

    if(convertView == null) { 
     convertView = inflater.inflate(R.layout.row_item, null); 
     holder = new ViewHolder(); 
     holder.itemName1 = (TextView)convertView.findViewById(R.id.text1); 
     ... 
     holder.container = (LineaLayout)convertView.findViewById(R.id.container); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    if(MainActivity.highlighted == position) { 
     holder.container.setBackgroundResource(R.drawable.highlighted_backg); 
    }else { 
     holder.foodItemCol1.setBackgroundResource(R.drawable.normal_back); 
    } 

    return convertView; 
} 
+0

たくさんお手伝いしました。ありがとうございました。 –

+0

優秀!最高の非常に良い答え!とにかくすべてのコードを投稿する – Kay

+0

?これが私の現在の状況にどのように適合しているかを見てみると少し迷っています –

1

セット:第七項目を「unhighlighting」ときLogCat出力その項目の背景色はgetView()にチェックされた状態になります。 ListViewから直接取得できるかどうかはわかりません。 a Setとし、現在チェックされている位置を保持します。 次に、getView()で、渡された位置がこのセットに含まれているかどうかを調べます。これは、それがチェックされ、それに応じて背景が設定されることを意味します。そうでない場合は、バックグラウンドを未チェックの色に設定します。あなたがバックグラウンドを 'チェックされた'色に設定しているリサイクルされたビューを与えられたので、後のものが重要です。

チェック項目を追跡する例は、hereです。

関連する問題