2012-11-11 19 views
5

ボタンを押すと、リストビュー内の単一の行を異なる内容で更新したいと考えています。私はnotifydatasetchanged(を使うことができると知っていますが)それはlistView全体を更新するでしょう。ListView単一の行を更新する

私はこれをanswerと読みました。これは私がしたいことに完全に合っています。

私は5行のリストビューを行いました。ボタンを押すと、4行目を別のテキストに更新したいと思います。私はテキストをプログラマチックに設定したくないのです。これは単なる行をリフレッシュできるかどうかを確認するためのダミープロジェクトです。私の実際のプロジェクトはちょうどtextviewより複雑です。

私の質問はの1行を更新するのにgetView()を使うことができますか?ここで

は私のコードです:

私の活動:

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); 

      } 
     }); 

    } 

} 

マイアダプタ:

012:

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; 
    } 

} 

これは、活動は次のようになります

しかし、私は私のボタンは何もできないコールgetViewメソッド()アダプタ自分の方法あなた

答えて

3

を変更しない]を押します。

  • リストビューは、ユーザーがスクロールリストビュー
  • notifysetdatachanged()

  • と呼ばれたときを作成するときに、アダプタのgetViewメソッド()メソッドは、呼び出されています。
    これらはすべてOSによって実行されます。 GetView()は、リストビュー内のすべての行に対して呼び出されます。これは単一行のために呼び出されるわけではありません。したがって、行を変更する場合は、String[]ArrayList<>などのデータを再度提供する必要があります
    ボタンのonClick()を1行に表示するには、

    パブリッククラス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が上記のコードで動作していません。

+0

偉大な答え。仰るとおりです。彼が行うことができるもう一つのことは、ListView自体に対してonItemClickListenerを設定するだけです。位置が何であれ(ボタンを使用しないと仮定した場合)、アダプタのリストを更新するだけです。もちろん、最終的に彼はどのオプションが彼にとって最善であるかを理解する必要があります。 – Andy

+0

@Andy:そうです。実際それはより良いアイデアでしょう。しかし、彼は具体的にボタンのクリックで行の内容を変更するように依頼して以来、私はこれに行きました。 – Ashwin

+0

:)ああ、あなたは技術的に正しいです@Ashwinただそのより効率的です。不必要な作業は一切行われません。彼は1行だけを更新したいからです。しかし、彼はこれは単なるテストであると言います。私は、彼はまた、もっと更新したいと思っている場合には、別の方法も持っているはずです。 – Andy

関連する問題