2015-06-10 2 views
0

Я боролся с этой проблемой в течение нескольких дней. Если вы ищете решение в stackoverflow или где-нибудь, то дается решение, попробовали все из них даже попробовать recyclerView, но ничего не помогло.Android Persistent ListView переработка

Моя проблема заключается в том, что у меня есть listview и два textView на listItem. Поэтому всякий раз, когда я нажимаю элемент списка, видимость одного textView GONE. Но когда я прокручиваю вниз, я вижу, что не только щелкнул один, но и многие другие исчезли. Heres мой код

CustomAdapter.java класс

package com.example.nara.testtt; 

import android.content.Context; 
import android.text.Layout; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget. 
import java.util.ArrayList; 

public class CustomAdapter extends BaseAdapter { 
private ArrayList<String> list = new ArrayList<String>(); 
private Context context; 
public CustomAdapter(Context context){ 
     this.context = context; 
    for(int i = 0; i < 50; i++){ 
     list.add("item at " + i); 
    } 
} 

@Override 
public int getCount() { 
    return list.size(); 
} 

@Override 
public String getItem(int position) { 
    return list.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 
    if(convertView == null){ 
     LayoutInflater inflator = LayoutInflater.from(context); 
     convertView = inflator.inflate(R.layout.list_item,null); 

     holder = new ViewHolder(convertView); 
     convertView.setTag(holder); 
    } else{ 
     holder = (ViewHolder)convertView.getTag(); 
    } 

    holder.tv1.setText(getItem(position)); 
    holder.tv2.setText(getItem(position)); 

    return convertView; 
} 

public static class ViewHolder{ 
    private TextView tv1; 
    private TextView tv2; 

    public ViewHolder(View view){ 
     tv1 = (TextView) view.findViewById(R.id.textView); 
     tv2 = (TextView) view.findViewById(R.id.textView2); 
    } 
} 
} 

MainActivity.java

package com.example.nara.testtt; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 
CustomAdapter adapter; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    adapter = new CustomAdapter(this); 

    ListView lv = (ListView) findViewById(R.id.listView); 
    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      TextView tv = (TextView) view.findViewById(R.id.textView); 
      tv.setVisibility(View.GONE); 
      adapter.notifyDataSetChanged(); 
     } 
    }); 
} 

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

}

ответ

1

В getView() после установки текста обновления видимость TextView к Видимый, так как listitems в ListView будут возвращены.

holder.tv1.setText(getItem(position)); 
holder.tv2.setText(getItem(position)); 
holder.tv1.setVisibility(View.VISIBLE); 
//Your code..... 

Обновлено:

общественного класса CustomAdapter расширяет BaseAdapter { личный список ArrayList = новый ArrayList(); частный контекст контекста;

public CustomAdapter(Context context) { 
     this.context = context; 
     for (int i = 0; i < 50; i++) { 
      list.add(new Bean("item at " + i)); 
     } 
    } 

    @Override 
    public Bean getItem(int position) { 
     return list.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     //Initialization ....... 

     Bean item = getItem(position); 
     holder.tv1.setText(item.name); 
     holder.tv2.setText(item.name); 
     holder.tv1.setVisibility(item.visibility); 
     return convertView; 
    } 
    // ViewHolder declaration 
    ....... 
public static class Bean { 
    String name; 
    int visibility = View.VISIBLE; 

    public Bean(String name) { 
     this.name = name; 
    } 
} 

В onItemНажмите на вашу деятельность.

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     TextView tv = (TextView) view.findViewById(R.id.textView); 
     Bean bean = Adapter.getItem(position); 
     bean.visibility = View.GONE 
     tv.setVisibility(View.GONE); 
     adapter.notifyDataSetChanged(); 
    } 
+0

'GONE' один будет также виден :( –

+0

жаль, что я не понял ваш комментарий. : { – Kartheek

+0

Я имею в виду, когда я сделаю вид невидимым, после прокрутки вниз и снова прокрутка просмотра не исчезнет, ​​это будет видно. –

1

Проблема в том, что виды возвращаются в ваш адаптер. Поэтому, когда вы прокручиваете старые взгляды, они привыкают к новым. Это означает, что если видимость элементов старого вида установлена ​​в GONE, все еще GONE в новых. Если вы не хотите, чтобы сохранить видимость, вы можете просто установить их видимыми в адаптере:

holder.tv1.setVisibility(View.VISIBLE); 
holder.tv1.setText(getItem(position)); 
holder.tv2.setText(getItem(position)); 

Или хранить логические значения в списке или что-то в этом роде и спросить там, если деталь была нажата:

if(clicked.get(i)) holder.tv1.setVisibility(View.GONE); 
else holder.tv1.setVisibility(View.VISIBLE); 
+0

Bro Я знаю, проблема с переработкой. Я хочу изменить только одно представление, которое было нажато на 'GONE'.Я получаю вашу идею, но если бы я установил видимость только щелкнутого представления на «GONE», то снова несколько представлений будут «GONE», даже если я использую ваш метод. –

+0

Если вы изменяете только логические значения в списке в 'onItemClick', а затем вызываете' notifyDataSetChanged', он должен работать. – mrtn

+0

Итак, вы хотите, чтобы я добавил другое представление в свой собственный макет и сохранил значения в этом макете? Разве нет более простого решения? :( –

0

Заменить

convertView = inflator.inflate(R.layout.list_item,null); 

с

convertView = inflator.inflate(R.layout.list_item,container,false);