بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
کیا با recyclerView کار کردن؟
کیا با recyclerView کار کردن؟
به یه مشکل عجیب برخوردم توش نمی دونم چیجوری توضیح بدم ، اگه کسی کار کرده بگه
0
0
اوووووف هیشکی کار نمیکنه؟ (9 سال پیش)
0
0
مشکلتون چیه؟ (9 سال پیش)
+1
0
ای بابا...کلافه شدیم بخدا با این اسپم کیلر لعنتی (9 سال پیش)
0
0
مشکلم اینه که وقتی لیست رو ساختم و دارم تست میکنم ، در حالی که اسکرول می کنم میبینم یه آیتم جلو چشام مقدارش عوض میشه ، با اسکرول مقدار یه آیتم دیگرو به خودش میگیره (9 سال پیش)
برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال
حمید زمانی
9 سال پیش
0
0
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'
}
پاسخ به سوال
حمید زمانی
9 سال پیش
0
0
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();
}
}
اینم با آرایه ی داینامیک ولی همون مشکل هنوز پا برجاست.
پاسخ به سوال
احسان منصوری
9 سال پیش
+4
0
ببینید، من از این کد استفاده میکنم. مشکلی هم ندارم.
کد اداپتر:
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 بود.
پاسخ به سوال
حمید زمانی
9 سال پیش
+2
0
مشکل پیدا شد :
همونطوری که آقای 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);
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .