2013-07-14 3 views
-1

У меня есть пользовательский ListView с несколькими TextViews и EditTexts, и я хочу, чтобы ресайклер не удалял данные, когда элемент прокручивается из поля зрения. Я посмотрел на другие сообщения, но я не нашел решение. Пожалуйста помоги.ListView Recycler, удаляющий данные

Вот мой код.

Java : 


import android.text.Editable; 
import android.view.LayoutInflater 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 



public class CustomAdapter extends BaseAdapter { 
    private int[] fif={0,0,0,0,0,0},tw={0,0,0,0,0,0},scorePerm={0,0,0,0,0,0},scorePerm2=  {0,0,0,0,0,0}; 
    private int scoreTemp=0;` 






private static final String TAG = CustomAdapter.class.getSimpleName(); 
ArrayList<DataModel> listArray; 

public CustomAdapter() { 
    listArray = new ArrayList<DataModel>(5); 
    listArray.add(new DataModel("Player 1", 1)); 
    listArray.add(new DataModel("Player 2", 2)); 
    listArray.add(new DataModel("Player 3", 3)); 
    listArray.add(new DataModel("Player 4", 4)); 
    listArray.add(new DataModel("Player 5", 5)); 
    listArray.add(new DataModel("Player 6", 6)); 

} 

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

@Override 
public Object getItem(int i) { 
    return listArray.get(i);  
} 

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

public int getViewTypeCount() {     

    return getCount(); 
} 

@Override 
public int getItemViewType(int position) { 

    return position; 
} 

@Override 
public View getView(int index, View view, final ViewGroup parent) { 

    if (view == null) { 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
     view = inflater.inflate(R.layout.list, parent,false); 

    } 



    view.setClickable(true); 
    view.setFocusable(true); 
    view.setBackgroundResource(android.R.drawable.menuitem_background); 

    final DataModel dataModel = listArray.get(index); 

    TextView textView = (TextView) view.findViewById(R.id.player_un); 
    textView.setText(dataModel.getName()); 

    Button button0 = (Button) view.findViewById(R.id.plus50); 

    Button button1 = (Button) view.findViewById(R.id.minus50); 

    Button button2 = (Button) view.findViewById(R.id.plus20); 

    Button button3 = (Button) view.findViewById(R.id.minus20); 

    Button ok = (Button) view.findViewById(R.id.un_ad_ok); 

    final Button reset = (Button) view.findViewById(R.id.un_ad_res); 

    final TextView score = (TextView) view.findViewById(R.id.score); 
    score.setText(R.string.scorepoints); 

    final EditText fifty = (EditText) view.findViewById(R.id.score50); 
    fifty.setText(R.string.scorepoints); 

    final EditText two = (EditText) view.findViewById(R.id.score20); 
    two.setText(R.string.scorepoints); 

    final EditText other = (EditText) view.findViewById(R.id.scoreplus); 
    other.setText(R.string.scorepoints); 



    //other code 



    return view; 
} 
} 


ListView XML : 

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

<EditText 
    android:id="@+id/scoreplus" 
    android:layout_width="50dp" 
    android:layout_height="40dp" 
    android:layout_alignLeft="@+id/plus20" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:descendantFocusability="beforeDescendants" 
    android:hint="@string/scorepoints" 
    android:inputType="number" /> 

<Button 
    android:id="@+id/minus20" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="30dp" 
    android:layout_height="40dp" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/scoreplus" 
    android:text="@string/minus" /> 

<EditText 
    android:id="@+id/score20" 
    android:layout_width="40dp" 
    android:layout_height="40dp" 
    android:layout_alignBaseline="@+id/minus20" 
    android:layout_alignBottom="@+id/minus20" 
    android:layout_toLeftOf="@+id/minus20" 
    android:inputType="number" 
    android:text="@string/scorepoints" 
    android:descendantFocusability="beforeDescendants" 
    android:textSize="12sp" /> 

<Button 
    android:id="@+id/plus20" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="30dp" 
    android:layout_height="40dp" 
    android:layout_alignTop="@+id/score20" 
    android:layout_toLeftOf="@+id/score20" 
    android:text="@string/plus" /> 

<ImageView 
    android:id="@+id/Image20" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBottom="@+id/score20" 
    android:layout_toLeftOf="@+id/plus20" 
    android:contentDescription="@string/player" 
    android:src="@drawable/ic_launcher" /> 

<Button 
    android:id="@+id/minus50" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="30dp" 
    android:layout_height="40dp" 
    android:layout_alignTop="@+id/score20" 
    android:layout_toRightOf="@+id/score50" 
    android:text="@string/minus" /> 

<EditText 
    android:id="@+id/score50" 
    android:layout_width="40dp" 
    android:layout_height="40dp" 
    android:layout_alignBaseline="@+id/minus50" 
    android:layout_alignBottom="@+id/minus50" 
    android:layout_toRightOf="@+id/plus50" 
    android:inputType="number" 
    android:text="@string/scorepoints" 
    android:descendantFocusability="beforeDescendants" 
    android:textSize="12sp" /> 

<Button 
    android:id="@+id/plus50" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="30dp" 
    android:layout_height="40dp" 
    android:layout_alignTop="@+id/score50" 
    android:layout_toRightOf="@+id/Image50" 
    android:text="@string/plus" /> 

<ImageView 
    android:id="@+id/Image50" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBottom="@+id/plus50" 
    android:layout_alignParentLeft="true" 
    android:contentDescription="@string/player" 
    android:src="@drawable/ic_launcher" /> 

<TextView 
    android:id="@+id/score" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBaseline="@+id/scoreplus" 
    android:layout_alignBottom="@+id/scoreplus" 
    android:layout_toRightOf="@+id/score50" 
    android:text="@string/scorepoints" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

<TextView 
    android:id="@+id/player_un" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBaseline="@+id/score" 
    android:layout_alignBottom="@+id/score" 
    android:layout_alignParentLeft="true" 
    android:text="@string/player" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

<Button 
    android:id="@+id/un_ad_ok" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="40dp" 
    android:layout_alignParentLeft="true" 
    android:layout_alignRight="@+id/minus50" 
    android:layout_below="@+id/score50" 
    android:text="@string/ok" /> 

<Button 
    android:id="@+id/un_ad_res" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="50dp" 
    android:layout_height="40dp" 
    android:layout_alignLeft="@+id/Image20" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/minus20" 
    android:enabled="false" 
    android:text="@string/cancel" /> 

+0

[Android Adapter Good Practices] (http://www.piwai.info/android-adapter-good-practices/). –

ответ

2

вы не реализовали адаптер в ListView, как вы должны.

смотрите «the world of listView» и, возможно, прочитайте this post, чтобы узнать, как обращаться с viewHolders.

Если вы хотите сохранить текст в editText, вы должны либо обновить данные, как только текст будет изменен, либо когда пользователь коснется listView (что немного сложнее).

Причина, по которой вы получаете эту «ошибку», заключается в том, что listView повторно использует старые представления, которые были прокручены за ее пределами, поэтому вам нужно где-то хранить потерянные данные и всегда обновлять представления до правильных данных.

+0

Мне очень нравится механизм утилизации, чтобы спасти баран. +1 для вас. –

+0

@ Eng.Fouad, когда он реализован хорошо, вы также можете сделать его очень быстрым и плавным. Кроме того, если есть подключение к интернету, вы можете использовать библиотеку Volley, как показано недавно в google IO 2013: https://developers.google.com/events/io/sessions/325304728 –

+0

Впечатляет! Где я могу найти библиотеку Volley? –

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

  • Нет связанных вопросов^_^