2016-03-22 2 views
0

После запроса некоторых новых данных адаптер Recycler View обновляет данные в конце предыдущих данных, где, поскольку я хочу показать только последние/свежие запрошенные данные на экране и удалить предыдущие данные. Ниже приведен код адаптера, при необходимости может быть показан другой код.Recyclerview, обновляющий данные в конце предыдущих данных

private LayoutInflater inflater; 
Context context; 
List<Data> dataArray, dataArray1, dataArray2; 

public RecyclerViewAdapter(Context context, List<Data> dataArray) { 
    swap(dataArray1); 
    this.dataArray1 = dataArray; 
    this.context = context; 
    inflater = LayoutInflater.from(context); 
} 
private void swap(List<Data> dataArray1){ 
    if (this.dataArray1 != null) { 
     this.dataArray.clear(); 
     System.out.println(dataArray1); 

    } 

    notifyDataSetChanged(); 
} 

@Override 
public RecyclerViewAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, null); 
    CustomViewHolder holder = new CustomViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(CustomViewHolder holder, int position) { 
    Data current = dataArray1.get(position); 
    //holder.image.setImageResource(current.Limage); 
    holder.textView1.setText(current.heading); 
    holder.textView2.setText(current.date); 

} 

@Override 
public int getItemCount() { 
    return dataArray1.size(); 
} 

public static class CustomViewHolder extends RecyclerView.ViewHolder { 
    //ImageView image; 
    TextView textView1, textView2; 

    public CustomViewHolder(View itemView) { 
     super(itemView); 
     // image = (ImageView)itemView.findViewById(R.id.Limage); 
     textView1 = (TextView) itemView.findViewById(R.id.heading); 
     textView2 = (TextView) itemView.findViewById(R.id.date); 

    } 
} 

} 

код Деятельность:

public RecyclerViewAdapter recyclerViewAdapter; 
Toolbar toolbar; 
public RecyclerView recyclerView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main_news); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    String url = "*****"; 
    new JSONAsync(getApplicationContext()).execute(url); 

    recyclerView = (RecyclerView)findViewById(R.id.recyclerView); 
    recyclerViewAdapter = new RecyclerViewAdapter(MainNews.this, JSONAsync.dataArray); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setAdapter(recyclerViewAdapter); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 


} 



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

    return super.onOptionsItemSelected(item); 
} 

}

Любая помощь будет высоко оценен.

+0

Не используйте конструктор для обновления данных в recyclerView. –

ответ

1

Я думаю, что вы добавляете все данные в список, как только вы получите новые данные. Вместо этого очистите arraylist и добавьте к нему новые данные и вызовите notify datasetChanged. Это должно решить вашу проблему. Если он не показывает вашу активность или фрагмент, содержащий обзор ресайклера.

+0

вы правы .... это сработало, но не все время, в первый раз ... его показывает предыдущий вывод, но после повторного нажатия той же активности он показывает ожидаемый ответ .... Добавил код активности, если вы можете предложите еще кое-что об этом – Umair

0

Не используйте конструктор для уточнения RecyclerView. Конструктор должен быть таким.

private LayoutInflater inflater; 
Context context; 
List<Data> dataArray; 

public RecyclerViewAdapter(Context context, List<Data> dataArray) { 
    this.dataArray = dataArray; 
    this.context = context; 
    inflater = LayoutInflater.from(context) 
} 

Установка адаптера для RecyclerView:

List<Data> dataArray; 

dataArray = new ArrayList<>(); 
adapter = new RecyclerViewAdapter(context, dataArray); 

recylerView.setAdapter(adapter); 

добавить и обновление данных:

dataArray.clear(); 
dataArray.add(data); 
adapter. notifyDataSetChanged(); 
+0

ну, я сделал это в начале, но он не работает ... все еще, если я это сделаю, я получаю тот же результат ... т.е. в конце предыдущего outut – Umair

0

Поскольку ваш CustomViewHolder является статическим классом.

Изменить его

public class CustomViewHolder extends RecyclerView.ViewHolder 
+0

nope не работает, тот же результат, что и раньше – Umair

0

Используйте этот код в ваш adapter-

private LayoutInflater inflater; 
Context context; 
List<Data> dataArray; 

public RecyclerViewAdapter(Context context, List<Data> dataArray) { 
    this.dataArray = dataArray; 
    this.context = context; 
    inflater = LayoutInflater.from(context); 
} 


@Override 
public RecyclerViewAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, null); 
    CustomViewHolder holder = new CustomViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(CustomViewHolder holder, int position) { 
    Data current = dataArray.get(position); 
    //holder.image.setImageResource(current.Limage); 
    holder.textView1.setText(current.heading); 
    holder.textView2.setText(current.date); 

} 

@Override 
public int getItemCount() { 
    return dataArray.size(); 
} 

public static class CustomViewHolder extends RecyclerView.ViewHolder { 
    //ImageView image; 
    TextView textView1, textView2; 

    public CustomViewHolder(View itemView) { 
     super(itemView); 
     // image = (ImageView)itemView.findViewById(R.id.Limage); 
     textView1 = (TextView) itemView.findViewById(R.id.heading); 
     textView2 = (TextView) itemView.findViewById(R.id.date); 

    } 
} 

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

В активность или Фрагмент

List<Data> dataArray = new List(); 

// your other code here.. 


private void yourMethodName() { 
    dataArray.clear(); 
    try{ 

     // your code to get data 

     // new add your new data to list 

     dataArray.add(yourData); 

    }catch (Exception ex){ 
     ex.getMessage(); 
    } 

    // Notify your adapter here 
    adapter.notifyDataSetChanged(); 
} 

Надеюсь, он сработает.

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