بروز خطا
[message]
رای ها
[dataList]
کیا با recyclerView کار کردن؟
کیا با recyclerView کار کردن؟
به یه مشکل عجیب برخوردم توش نمی دونم چیجوری توضیح بدم ، اگه کسی کار کرده بگه
اوووووف هیشکی کار نمیکنه؟ (11 سال پیش)
مشکلتون چیه؟ (11 سال پیش)
ای بابا...کلافه شدیم بخدا با این اسپم کیلر لعنتی (11 سال پیش)
مشکلم اینه که وقتی لیست رو ساختم و دارم تست میکنم ، در حالی که اسکرول می کنم میبینم یه آیتم جلو چشام مقدارش عوض میشه ، با اسکرول مقدار یه آیتم دیگرو به خودش میگیره (11 سال پیش)
برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال
حمید زمانی
11 سال پیش
Adapter :
public class AdapterList extends RecyclerView.Adapter<AdapterList.ViewHolder> {
Item[] itemsStatic;
public AdapterList(ArrayList<Item> it) {
itemsStatic = new Item[it.size()];
for(int i=0; i<it.size(); i++){
itemsStatic[i] = it.get(i);
}
}
//a Reference to Views
public static class ViewHolder extends RecyclerView.ViewHolder{
public static TextView txtItem;
public static ImageView imgItem;
public static LinearLayout lnlItem;
public ViewHolder(View v){
super(v);
txtItem = (TextView) v.findViewById(R.id.txt_item);
imgItem = (ImageView) v.findViewById(R.id.img_item);
lnlItem = (LinearLayout) v.findViewById(R.id.lnl_item);
}
}
//Create new views
@Override
public AdapterList.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item,viewGroup,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
//Replace Content Of a View
@Override
public void onBindViewHolder(AdapterList.ViewHolder viewHolder, final int i) {
viewHolder.txtItem.setText(itemsStatic[i].title);
viewHolder.imgItem.setImageResource(G.c.getResources().getIdentifier(itemsStatic[i].image,"drawable",G.c.getPackageName()));
}
@Override
public int getItemCount() {
return itemsStatic.length;
}
}
Activity :
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
RecyclerView.Adapter adapter = new AdapterList(G.items);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
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=".MainActivity"
android:background="#e0e0e0">
<include
android:id="@+id/tool_bar"
layout="@layout/tool_bar"
android:layout_height="wrap_content"
android:layout_width="match_parent" />
<android.support.v7.widget.RecyclerView
android:layout_below="@+id/tool_bar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
android:id="@+id/recycler_view" />
<ImageButton
android:id="@+id/fab_image_button"
android:layout_width="@dimen/fab_button_diameter"
android:layout_height="@dimen/fab_button_diameter"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="@dimen/fab_button_margin_bottom"
android:layout_marginLeft="@dimen/fab_button_margin_right"
android:background="@drawable/fab_shape"
android:src="@drawable/fab_ic_add"
android:tint="@android:color/white"/>
</RelativeLayout>
build.gradle :
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.android.support:recyclerview-v7:21.0.3'
compile 'com.android.support:cardview-v7:21.0.3'
}
پاسخ به سوال
حمید زمانی
11 سال پیش
public class AdapterList extends RecyclerView.Adapter<AdapterList.ViewHolder> {
ArrayList<Note> items;
public AdapterList(ArrayList<Note> items) {
this.items = items;
}
//a Reference to Views
public static class ViewHolder extends RecyclerView.ViewHolder{
public static TextView txtTitle;
public static TextView txtText;
public ViewHolder(View v){
super(v);
txtTitle = (TextView) v.findViewById(R.id.txt_title);
txtText = (TextView) v.findViewById(R.id.txt_text);
}
}
//Create new views
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout,viewGroup,false);
return new ViewHolder(view);
}
//Replace Content Of a View
@Override
public void onBindViewHolder(AdapterList.ViewHolder viewHolder, final int i) {
Note n = items.get(i);
if(n.title == null){
viewHolder.txtTitle.setText("");
}else{
viewHolder.txtTitle.setText(n.title);
}
if(n.text == null){
viewHolder.txtText.setText("");
}else{
viewHolder.txtText.setText(n.text);
}
}
@Override
public int getItemCount() {
return items.size();
}
}
اینم با آرایه ی داینامیک ولی همون مشکل هنوز پا برجاست.
پاسخ به سوال
احسان منصوری
11 سال پیش
ببینید، من از این کد استفاده میکنم. مشکلی هم ندارم.
کد اداپتر:
public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.viewHolder>{
Context context;
private LayoutInflater inflater;
public AdapterRecyclerView(Context context, List<Information> data){
inflater=LayoutInflater.from(context);
G.recyclerList= (java.util.ArrayList<Information>) data;
}
@Override
public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.adapter_recycler, parent, false);
viewHolder holder = new viewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(viewHolder holder, final int position) {
final LocationManager manager = (LocationManager) G.context.getSystemService(Context.LOCATION_SERVICE);
Information current = G.recyclerList.get(position);
holder.title.setText(current.p_uname);
holder.desc.setText(current.p_desc);
String url = current.p_logo;
Log.e("LOG", "URL_IMAGE_UNIVERSAL: " + url);
holder.btnProfile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
holder.btnRouting.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
public int getItemCount() {
return G.recyclerList.size();
}
class viewHolder extends RecyclerView.ViewHolder{
TextView title;
TextView desc;
FrameLayout btnProfile;
FrameLayout btnRouting;
ImageView image;
public viewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.txtTitle);
desc = (TextView) itemView.findViewById(R.id.txtDesc);
btnProfile = (FrameLayout) itemView.findViewById(R.id.btnProfile);
btnRouting = (FrameLayout) itemView.findViewById(R.id.btnRouting);
image = (ImageView) itemView.findViewById(R.id.imageView);
}
}
}
اینم کدی هست که اطلاعات رو از سرور میگیرم و با اداپتر RecyclerView ست میکنم:
توی onCreate:
recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(G.context);
recyclerView.setLayoutManager(layoutManager);
اینم AsyncTask برای دریافت اطلاعات از سرور:
public class asyncRecyclerview extends AsyncTask<Void, Void, List<Information>> {
protected void onPreExecute() {
super.onPreExecute();
dialog3 = ProgressDialog.show(G.currentActivity, "", "در حال بارگزاری...", true);
}
@Override
protected List<Information> doInBackground(Void... params) {
//Read URL For Receive Json Code
String result = Webservice.readUrl(url);
Log.i("LOG", "URLRESULT: "+ result);
if (result != null) {
try {
G.recyclerList.clear();
JSONArray jsonurl = new JSONArray(result);
for (int i = 0; i < jsonurl.length(); i++) {
JSONObject object = jsonurl.getJSONObject(i);
Information url = new Information();
String img_url = object.getString("p_logo");
url.p_logo = (G.ip + "images/" + img_url);
url.p_uname = object.getString("p_uname");
url.p_desc = object.getString("p_desc");
url.p_uid = object.getInt("p_uid");
G.recyclerList.add(url);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return G.recyclerList;
}
@Override
protected void onPostExecute(List<Information> result) {
super.onPostExecute(result);
//tarif va meghdar dehie RecyclerView
adapter = new AdapterRecyclerView(G.context, result);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(G.context));
recyclerView.setLayoutManager(new LinearLayoutManager(G.currentActivity, LinearLayoutManager.HORIZONTAL, false));
//end
dialog3.dismiss();
}
}
و در آخر هم Async رو داخل onCreate اجرا میکنید
new asyncRecyclerview().execute();
اینی که نوشتم به نظرم راحتترین روش پیاده سازی RecyclerView بود.
پاسخ به سوال
حمید زمانی
11 سال پیش
مشکل پیدا شد :
همونطوری که آقای Hajhosseini فرموده بودند هیچکدام از ویو ها نباید استاتیک باشه و با تغییر کلاس ViewHolder به کد زیر مشکل حل شد ، از همه دوستان تشکر میکنم ، مخصوصا حسین احمدی (CodeMaster) که تلفنی راهنماییم کرد.
public class ViewHolder extends RecyclerView.ViewHolder{
TextView txtItem;
ImageView imgItem;
LinearLayout lnlItem;
public ViewHolder(View v){
super(v);
txtItem = (TextView) v.findViewById(R.id.txt_item);
imgItem = (ImageView) v.findViewById(R.id.img_item);
lnlItem = (LinearLayout) v.findViewById(R.id.lnl_item);
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .