0

コンテンツを表示する1つのtextViewと1つのimageViewを持つlistViewを持つアプリを開発しています。私が欲しいのは、listViewをクリックすると、私が持っている目盛り画像でimageViewを設定したいということです。その正常に動作します。listView をクリックすると、クリックしたリストビュー項目に目盛りの画像が読み込まれます。

スクロールすると問題が発生します。スクロールすると、下にある他のリストビュー項目に目盛りがロードされていることがわかりました。画像がその位置にどのように設定されたのかわかりません。

listView がスクロールされると、ビューが更新されることをどこかで読んだことがあります。それが問題の原因ですか?

誰でもこれを解決する方法を教えてもらえますか? クリックした listView アイテムと他の listView アイテムに画像を表示 (ロード) したい。

以下は、listView項目を示すxmlです

method_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@android:color/white"
        android:text="This is a check box button which reacts upon the check that user clicks. I am testing it with the big string and checking how it looks" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_alignParentRight="true"
        android:layout_marginRight="34dp" />

</RelativeLayout>

以下は、クラス スニペットの一部です。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.method_list_main);

    final ListView list = (ListView)findViewById(R.id.listView1);

    adapter=new MethodLazyAdapter(this,ARRAY.preparationSteps,ARRAY.timeToPrepare,ARRAY.arrowValue,noOfSteps,list);
    list.setAdapter(adapter);

    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // TODO Auto-generated method stub
             RelativeLayout ll = (RelativeLayout) view;
              ImageView image = (ImageView)ll.findViewById(R.id.imageView2);

              if(tick[position]){
                  tick[position] = false;
                    image.setImageResource(0);                      
              }
              else{
                  tick[position] = true;
                      image.setImageResource(R.drawable.select_right);  
              }

            System.out.println("Position is: "+position);


        }
    });
}

最初はすべての tick[i] 値が false に設定されています。

以下は、アダプタークラスの getView 関数です

public View getView(final int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.method_item, null);

    TextView text = (TextView)vi.findViewById(R.id.textView1);
    text.setText(preparationSteps\[position\]);
    return vi;
}
4

2 に答える 2

2

あなたが望むものを得るためにこれを試してください

パブリックエリアにこの変数を追加します

public SparseBooleanArray checked = new SparseBooleanArray();

次にonItemClick

list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                boolean stat = checked.get(position, false);
                checked.put(position, !stat);
                adapter.setChecked();
                System.out.println("Position is: "+position);


            }
        });

およびアダプタークラスで

アダプタがアクティビティのサブクラスでない場合は、パブリック領域に変数を追加します

private SparseBooleanArray checked = new SparseBooleanArray();

このメソッドをクラスに追加します

public void setChecked(SparseBooleanArray ch){
    checked = ch;
   notifyDataSetChanged();
}

または、サブクラスchekedで定義した変数を使用する場合

次にgetView方法で

public View getView(final int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.method_item, null);

    TextView text = (TextView)vi.findViewById(R.id.textView1);
    text.setText(preparationSteps\[position\]);

    ImageView image = (ImageView)vi.findViewById(R.id.imageView2);
    if(checked.get(position, false)){
          image.setImageResource(0);                      
    }
    else{
            image.setImageResource(R.drawable.select_right);  
    }
    return vi;
}

これがあなたを助けるかどうか私に知らせてください。

于 2013-03-08T20:06:00.430 に答える
0

この投稿をチェックしてください:

Android - JSONArray からのデータを ListView に取り込む

その理由は、変換されたビューを間違って使用しているからです。貼り付けた投稿のサンプルコードに従ってください。

この問題が消えるたびに行ビューを膨らませると。ただし、この実装は推奨されません。

于 2013-03-08T19:01:06.680 に答える