1

listViewに画像とテキストを配置し、listViewに行を動的に追加できるlistViewを作成します。

ただし、listViewで特定の行アイテムのレイアウトを変更できるように実装する方法がわかりません。

たとえば、アクティビティの開始時に、listViewを5行で初期化し、トリガーが発生したときに(数分後)、たとえば4番目のlistViewアイテムを変更したい(4番目のエントリのレイアウトのみを変更する、その他すべてエントリは元のレイアウトのままです)

どうもありがとう

private  ListView lv;
private List<String> text = new ArrayList<String>();
private List<Bitmap> listImages;
private String freindsId;

ArrayList<String> text_sort = new ArrayList<String>();
ArrayList<Bitmap> image_sort = new ArrayList<Bitmap>();


private MyCustomAdapter adapter;
  adapter =new MyCustomAdapter(text,listImages);
  lv.setAdapter(adapter);

class MyCustomAdapter extends BaseAdapter{
          public   List<String> text_array = new ArrayList<String>();
          public   List<Bitmap> image_array = new ArrayList<Bitmap>();
          public int getCount(){
               return text_array.size();
          }

          MyCustomAdapter(List<String> text, List<Bitmap> image)
          {
           text_array = text;
           image_array = image;
          }
          public long getItemId(int position){
               return position;
          }
          public String getItem(int position){
               return null;
          }
          public View getView(final int position, View convertView, ViewGroup parent) {
            LayoutInflater inflate = getLayoutInflater();
            View v = inflate.inflate(R.layout.listview, parent, false);
            final ImageView image = (ImageView) v.findViewById(R.id.ImageView01);
            TextView txtUnderImage =(TextView) v.findViewById(R.id.TextView01);

             if(listImages.get(position) != null) {
                         Bitmap bitmap = image_array.get(position);
                        image.setImageBitmap(bitmap);
                        ByteArrayOutputStream stream = new ByteArrayOutputStream();
                        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                        final byte[] byteArray = stream.toByteArray();

                         image.setOnClickListener(new View.OnClickListener() {

                            public void onClick(View v) {
                                // Switching to Register screen
                             Intent i = new Intent(getApplicationContext(), itemSaleActivity.class);
                             i.putExtra("picture", byteArray);
                            startActivity(i);


                                }
                        });
                         txtUnderImage.setText(text_array.get(position));
                         image.setVisibility(View.VISIBLE);
              } else {
                         image.setVisibility(View.GONE);
                         image.setImageBitmap(null);
                          image.setVisibility(View.VISIBLE);
          }
         return v;

        }
         public void addObject(String text, Bitmap bitmap) {
                text_array.add(text);
                image_array.add(bitmap);
            notifyDataSetChanged();
         } 

         public void addFirst(String text, Bitmap bitmap) {

                image_array.add(0,bitmap);
                text_array.add(0,text);

                notifyDataSetChanged();
             } 
         public void removeObject(String text,Bitmap bitmap) {

                int indexToRemove = image_array.indexOf(bitmap);
                image_array.remove(indexToRemove);
                text_array.remove(indexToRemove);
                notifyDataSetChanged();
         }
         public void deleteAll() {
             image_array.clear();
             text_array.clear();
             notifyDataSetChanged();
         }
    }
4

4 に答える 4

0

このように特定の位置のビューを取得してみてください

getChildAt(position)あなたはあなたの見解を得るでしょう、

行のレイアウトを変更し、notifyDataSetChanged()を呼び出します。

選択した行を強調しようとしている場合は、AndroidのOnClickListenerからこの Inflate ListView行を使用しますか?

イベントトリガーがアダプターのデータを変更し、AdapaterオブジェクトでnotifyDataSetChanged()を呼び出す場合。

于 2013-03-19T17:39:49.487 に答える
0

このメソッドを使用して、getChildAt()変更する行にアクセスします。例えばlistView.getChildAt(4)

于 2013-03-19T17:43:47.977 に答える
0

4行目の項目に変更を加えます。アダプタでnotifyDataSetChanged()を呼び出します。

notifyDataSetChanged()基になるデータが変更され、データセットを反映するビューが自動的に更新される必要があることをアタッチされたオブザーバーに通知します。

notifyDataSetChanged()は、リストビューを更新します。

于 2013-03-19T17:44:31.897 に答える
0

ここで説明する方法では、リスト全体を確認します。表示されているビューを更新するだけで済みますが、残りの変更は「再描画」される間、処理されます。

したがって、このリンクで提供されている回答を見てください。ビューの位置を特定するだけで、その時点で表示されている場合にのみビューを更新できるソリューションが提供されます。

その答えを引用するには-

int iFirst = getFirstVisiblePosition();
int iLast = getLastVisiblePosition();

if ( indexToChange >= numberOfRowsInSection() ) {
    Log.i( "MyApp", "Invalid index. Row Count = " + numberOfRowsInSection() );
}
else {      
    if ( ( index >= iFirst ) && ( index <= iLast ) ) {
        // get the view at the position being updated - need to adjust index based on first in the list
        View vw = getChildAt( sysvar_index - iFirst );
        if ( null != vw ) {
            // get the text view for the view
            TextView tv = (TextView) vw.findViewById(com.android.myapp.R.id.scrollingListRowTextView );
            if ( tv != null ) {
                // update the text, invalidation seems to be automatic
                tv.setText( "Item = " + myAppGetItem( index ) + ". Index = " + index + ". First = " + iFirst + ". Last = " + iLast );
            }
        }
    }
} 
于 2015-06-28T20:31:08.843 に答える