2015-06-19 4 views
0

Я пытаюсь создать ListView с использованием многоколоночного формата. Я нашел несколько примеров, и я изменил его для тестирования. Я хочу создать список, содержащий данные из Bluetooth-соединения (И мне нужно сохранить свою позицию, когда список будет обновлен).Multicolumn ListView не обновляется с помощью notifyDataSetChanged()

В моей деятельности есть список и кнопка. При нажатии кнопки мой список должен показать новые значения заменить все первые буквы ссылки с номерами, но вот что происходит:

Список загружен:

enter image description here

После нажатия нажатия:

enter image description here

Введите код:

Активность_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<ListView 
    android:id="@+id/listView" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent"> 
</ListView> 

<Button 
    android:id="@+id/btnOk" 
    android:layout_width="100dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:text="OK"> 
</Button> 

listview_row.xml

<LinearLayout 
android:id="@+id/relativeLayout1" 
android:layout_height="fill_parent" 
android:layout_width="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android"> 

<TextView 
    android:id="@+id/Text1" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:text="First" 
    android:layout_weight="1"> 
</TextView> 

<TextView 
    android:id="@+id/Text2" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:text="Second" 
    android:layout_weight="2"> 
</TextView> 

<TextView 
    android:id="@+id/Text3" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:text="Third" 
    android:layout_weight="1"> 
</TextView> 

<TextView 
    android:id="@+id/Text4" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:text="Fourth" 
    android:layout_weight="1"> 
</TextView> 

MainActivity.java

public class MainActivity extends ActionBarActivity { 

private ArrayList<HashMap<String, String>> list; 
private Button btnOk; 
private ListView listView; 
private ListViewAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listView = (ListView) findViewById(R.id.listView); 

    list = new ArrayList<HashMap<String, String>>(); 

    HashMap<String, String> temp1 = new HashMap<String, String>(); 
    temp1.put("Text1", "A1"); 
    temp1.put("Text2", "A2"); 
    temp1.put("Text3", "A3"); 
    temp1.put("Text4", "A4"); 
    list.add(temp1); 

    HashMap<String, String> temp2 = new HashMap<String, String>(); 
    temp2.put("Text1", "B1"); 
    temp2.put("Text2", "B2"); 
    temp2.put("Text3", "B3"); 
    temp2.put("Text4", "B4"); 
    list.add(temp2); 

    HashMap<String, String> temp3 = new HashMap<String, String>(); 
    temp3.put("Text1", "C1"); 
    temp3.put("Text2", "C2"); 
    temp3.put("Text3", "C3"); 
    temp3.put("Text4", "C4"); 
    list.add(temp3); 

    adapter = new ListViewAdapter(this, list); 
    listView.setAdapter(adapter); 

    btnOk = (Button) findViewById(R.id.btnOk); 

    // create click listener 
    View.OnClickListener oclBtnOk = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      // Limpiar Valor 
      list.clear(); 

      HashMap<String, String> temp4 = new HashMap<String, String>(); 
      temp4.put("Text1", "11"); 
      temp4.put("Text2", "12"); 
      temp4.put("Text3", "13"); 
      temp4.put("Text4", "14"); 
      list.add(temp4); 

      HashMap<String, String> temp5 = new HashMap<String, String>(); 
      temp5.put("Text1", "21"); 
      temp5.put("Text2", "22"); 
      temp5.put("Text3", "23"); 
      temp5.put("Text4", "24"); 
      list.add(temp5); 

      HashMap<String, String> temp6 = new HashMap<String, String>(); 
      temp6.put("Text1", "31"); 
      temp6.put("Text2", "32"); 
      temp6.put("Text3", "33"); 
      temp6.put("Text4", "34"); 
      list.add(temp6); 

      HashMap<String, String> temp7 = new HashMap<String, String>(); 
      temp7.put("Text1", "41"); 
      temp7.put("Text2", "42"); 
      temp7.put("Text3", "43"); 
      temp7.put("Text4", "44"); 
      list.add(temp7); 

      HashMap<String, String> temp8 = new HashMap<String, String>(); 
      temp8.put("Text1", "51"); 
      temp8.put("Text2", "52"); 
      temp8.put("Text3", "53"); 
      temp8.put("Text4", "54"); 
      list.add(temp8); 

      // Actualizar 
      adapter.notifyDataSetChanged(); 
     } 
    }; 

    // assign click listener to the OK button (btnOK) 
    btnOk.setOnClickListener(oclBtnOk); 
} 

    @Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

// Adaptador para el ListView 
private class ListViewAdapter extends BaseAdapter { 

    public ArrayList<HashMap<String, String>> list; 

    Activity activity; 
    TextView txt1; 
    TextView txt2; 
    TextView txt3; 
    TextView txt4; 

    public ListViewAdapter(Activity activity,ArrayList<HashMap<String, String>> list){ 
     super(); 
     this.activity=activity; 
     this.list=list; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return list.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     LayoutInflater inflater=activity.getLayoutInflater(); 

     if(convertView == null){ 

      convertView=inflater.inflate(R.layout.listview_row, null); 

      txt1=(TextView) convertView.findViewById(R.id.Text1); 
      txt2=(TextView) convertView.findViewById(R.id.Text2); 
      txt3=(TextView) convertView.findViewById(R.id.Text3); 
      txt4=(TextView) convertView.findViewById(R.id.Text4); 

     } 

     HashMap<String, String> map=list.get(position); 
     txt1.setText(map.get("Text1")); 
     txt2.setText(map.get("Text2")); 
     txt3.setText(map.get("Text3")); 
     txt4.setText(map.get("Text4")); 

     return convertView; 
    } 
} 
+0

Я просто хочу сказать вам, что для добавления данных вы создаете слишком много объектов temp и добавляете их в адаптер. Вместо этого просто создайте один временный объект. после добавления его в адаптер просто очистите этот временный адаптер. и установите другое значение и добавьте его снова. – Moinkhan

+0

Добавьте 'list.trimToSize' после' list.clear() 'и посмотрите, решит ли это вашу проблему или нет. – Pankaj

+0

Это решение помогает вам ??? – Pankaj

ответ

0

Просто создать один объект временный и использовать его, как это ..may быть это поможет вам ..

list = new ArrayList<HashMap<String, String>>(); 

HashMap<String, String> temp = new HashMap<String, String>(); 
temp.put("Text1", "A1"); 
temp.put("Text2", "A2"); 
temp.put("Text3", "A3"); 
temp.put("Text4", "A4"); 
list.add(temp); 

temp.clear(); 
temp.put("Text1", "B1"); 
temp.put("Text2", "B2"); 
temp.put("Text3", "B3"); 
temp.put("Text4", "B4"); 
list.add(temp); 

temp.clear(); 
temp.put("Text1", "C1"); 
temp.put("Text2", "C2"); 
temp.put("Text3", "C3"); 
temp.put("Text4", "C4"); 
list.add(temp); 
+0

Используя только результаты темпового объекта, сначала список, заполненный 3 строками, все с C1 C2 C3 C4 и после нажатия кнопки 2 новых строки все с 51 52 53 54 – Madbyte

Смежные вопросы