5

ボタンを押すと、リストビューの単一の行を別のコンテンツで更新したいと考えています。を使用できることはわかっていますnotifydatasetchanged(が、それは全体を更新しますlistView

私はこの回答を読みましたが、それは私がやりたいことに完全に適合しています。

5行のリストビューを作成しましたが、ボタンを押すと、4行目を別のテキストで更新したいと思います。これは単なるダミープロジェクトであり、単一の行を更新できるかどうかを確認するためのものであり、実際のプロジェクトはtextview.

私の質問は次のとおりです。getView()単一の行を更新するために使用できlistviewますか?

これが私のコードです:

私の活動:

public class MainActivity extends Activity {

    public ListView list1;
    public listAdapter adapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list1 = (ListView) findViewById(R.id.my_list);
        adapter = new listAdapter(this);
        list1.setAdapter(adapter);

        Button button1 = (Button) findViewById(R.id.my_button);
        button1.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                adapter.setText("Different text");
                View row2Update = list1.getChildAt(3);
                list1.getAdapter().getView(3, row2Update, list1);

            }
        });

    } 

}

私のアダプター:

public class listAdapter extends BaseAdapter{

    public Activity activity;
    public String text="Normal Text";

    public listAdapter(Activity activity){

        this.activity = activity;
    }

    public void setText(String text){
        this.text = text;
    }

    public int getCount() {
        return 5;
    }

    public Object getItem(int position) {

        return null;
    }

    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = activity.getLayoutInflater();
        LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.row_layout, null);
        TextView textView = (TextView) rowView.findViewById(R.id.row_text);
        textView.setText(text);
        return rowView;
    }

}

アクティビティは次のようになります。

アクティビティのスナップショット

でもボタンを押しても何も変わらない

4

1 に答える 1

3

アダプターのgetView()メソッドを自分で呼び出すことはできません。アダプターの getView() メソッドは、次の場合にのみ呼び出されます。

  • リストビューが作成されます
  • ユーザーがリスト ビューをスクロールしたとき
  • notifysetdatachanged() が呼び出されたとき。
    これらはすべてOSによって行われます。リストビューのすべての行に対して GetView() が呼び出されます。単一の行に対してのみ呼び出されるわけではありません。String[]そのため、行を変更したい場合は、データをもう一度提供する必要がありますArrayList<>
    単一の行に別のテキストを表示したい場合は、ボタンの onClick() - これを行うことができます

    public class listAdapter は BaseAdapter を拡張します{

    public Activity activity;
    public ArrayList<String> text;
    
    public listAdapter(Activity activity){
    
        this.activity = activity;
    }
    
    public void setText(ArrayList<String> text){
        this.text = text;
    }
    
    public int getCount() {
        return 5;
    }
    
    public Object getItem(int position) {
    
        return null;
    }
    
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = activity.getLayoutInflater();
        LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.row_layout, null);
        TextView textView = (TextView) rowView.findViewById(R.id.row_text);
        textView.setText(text[position]);
        return rowView;
    }
    

    あなた
    のアクティビティで:

    list1 = (ListView) findViewById(R.id.my_list);
    adapter = new listAdapter(this);
    String[] entries={"Normal Text","Normal Text","Normal Text","Normal text","Normal text"};
    ArrayList<String> text=Arrays.asList(entries);
    adapter.setText(text);
    list1.setAdapter(adapter);
    
    Button button1 = (Button) findViewById(R.id.my_button);
    button1.setOnClickListener(new OnClickListener() {
    
        public void onClick(View v) {
           text.set(3,"Different Text");
            adapter.setText(text);
            list1.setAdapter(adapter);
    
        }
    });
    


    @Andyがコメントの1つで提案したように、別の方法もあります:

    listViewPeople.setOnItemClickListener(new ListView.OnItemClickListener() {
            @Override
        public void onItemClick(AdapterView<?> a, View v, int position, long l) {
                 //IF YOU WANT TO CHANGE THE CONTENT OF THE ROW CLICKED
           if(position == someNumber) {
                   text.set(position,"different Text");
                   list1.setAdapter(text);
           }
        }
    });
    

太字で申し訳ありません。何らかの理由で、上記のコードでCTRL+Kが機能しません。

于 2012-11-11T02:40:13.077 に答える