android - রথম - স্মার্টফোন বলতে কি বুঝায়
অ্যানড্রয়েড অনুভূমিক তালিকা দেখুন? (13)
ListView
অনুভূমিকভাবে করা সম্ভব? আমি গ্যালারি ভিউ ব্যবহার করে এটি করেছি, কিন্তু নির্বাচিত আইটেম স্বয়ংক্রিয়ভাবে স্ক্রিনের কেন্দ্রে আসে। আমি নির্বাচিত আইটেমটি একই স্পট এ ক্লিক করতে চাই না। আমি কিভাবে এই সমস্যা সংশোধন করতে পারি? আমার আইডিয়া অনুভূমিক স্ক্রোল সঙ্গে ListView
সেট করা ছিল। আপনার ধারণা শেয়ার করুন?
@ পল উত্তর একটি দুর্দান্ত সমাধান লিঙ্ক, কিন্তু কোড আইটেমগুলিতে শিশুদের উপর ক্লিক করা অনুমতি দেয় না (কলব্যাক ফাংশন বলা হয় না)। আমি সমাধান খুঁজে পাওয়ার জন্য কিছু সময়ের জন্য সংগ্রাম করেছি এবং আমি আপনাকে কোডটিতে পরিবর্তন করার জন্য এখানে ক্লিক করার সিদ্ধান্ত নিয়েছি (যদি কাউকে এটি প্রয়োজন হয়)।
পরিবর্তে dispatchTouchEvent
onTouchEvent
overriding এর পরিবর্তে। DispatchTouchEvent এর একই কোডটি ব্যবহার করুন এবং পদ্ধতিটি মুছুন (আপনি এখানে http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers মধ্যে পার্থক্যটি পড়তে পারেন)
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean handled = mGesture.onTouchEvent(event);
return handled;
}
তারপরে, নিম্নলিখিত কোডটি যোগ করুন যা আইটেম শিশুদের থেকে ইভেন্টটি চুরি করতে এবং আমাদের onTouchEvent
দেওয়ার সিদ্ধান্ত onTouchEvent
, বা এটি তাদের দ্বারা পরিচালিত হতে দিন।
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch( ev.getActionMasked() ){
case MotionEvent.ACTION_DOWN:
mInitialX = ev.getX();
mInitialY = ev.getY();
return false;
case MotionEvent.ACTION_MOVE:
float deltaX = Math.abs(ev.getX() - mInitialX);
float deltaY = Math.abs(ev.getY() - mInitialY);
return ( deltaX > 5 || deltaY > 5 );
default:
return super.onInterceptTouchEvent(ev);
}
}
অবশেষে, আপনার বর্গের ভেরিয়েবলগুলি ঘোষণা করতে ভুলবেন না:
private float mInitialX;
private float mInitialY;
অ্যাডাপ্টারের ডেটা অন্য থ্রেডে জড়িত হলে HorizontialListView কাজ করতে পারে না। সবকিছু ইউআই থ্রেডে 100% চালায়। এটি মাল্টিথ্রেডে একটি বড় সমস্যা। আমি মনে করি হরাইজন্টিয়াললিস্ট ভিউ ব্যবহার করা আপনার সমস্যার জন্য সর্বোত্তম সমাধান নয়। হরজলিস্ট ভিউ একটি ভাল উপায়। আপনি শুধু আপনার পূর্ববর্তী গ্যালারিটি হর্জলিস্ট ভিউ দিয়ে প্রতিস্থাপন করুন। আপনাকে অ্যাডাপ্টারের কোডটি সংশোধন করতে হবে না। তারপরে সবকিছু আশা করে যাচ্ছেন। Https https://.com/a/12339708/1525777 .com/a/12339708/1525777 HorzListView সম্পর্কে।
আপনি লেআউট এক্সএমএলটি অন্তর্ভুক্ত করতে ভিউফ্লিপার ব্যবহার করতে পারেন এবং প্রতিটি বিন্যাস এক্সএমএলগুলির জন্য চিত্র, তালিকাউইউউউ যুক্ত করতে পারেন
আপনি সমর্থন লাইব্রেরিতে RecyclerView ব্যবহার করতে পারেন। RecyclerView ListView এর একটি সাধারণ সংস্করণ যা সমর্থন করে:
- পজিশনিং আইটেম জন্য একটি বিন্যাস ম্যানেজার
- সাধারণ আইটেম অপারেশন জন্য ডিফল্ট অ্যানিমেশন
আমার একটা প্রকল্পের জন্য একই কাজ করতে হয়েছিল এবং আমি নিজের লেখার পাশাপাশি লিখলাম। আমি এটি হরজলিস্ট ভিউ এখন আমার মুক্ত উৎস Aniqroid গ্রন্থাগারের অংশ।
http://aniqroid.sileria.com/doc/api/ (নীচের ডাউনলোডগুলির জন্য সন্ধান করুন অথবা আরও ডাউনলোড বিকল্প দেখতে গুগল কোড প্রকল্পটি ব্যবহার করুন: http://code.google.com/p/aniqroid/downloads/list )
ক্লাস ডকুমেন্টেশন এখানে: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html
আমার সমাধান কেবল ViewPager
উইজেট ব্যবহার করা হয়। এটি Gallery
হিসাবে কেন্দ্র-লক নয় এবং পুনর্ব্যবহারযোগ্য দর্শনের জন্য বিল্ট-ইন বৈশিষ্ট্য রয়েছে (তালিকা ভিউ হিসাবে)। যখনই আপনি অনুভূমিকভাবে স্ক্রোলযোগ্য তালিকাগুলি মোকাবেলা করেন তখন আপনি Google Play অ্যাপ্লিকেশানে একই পদ্ধতি দেখতে পারেন।
আপনি শুধু PagerAdapter
প্রসারিত করতে এবং সেখানে কয়েকটি tweaks সঞ্চালন করতে হবে:
public class MyPagerAdapter extends PagerAdapter {
private Context mContext;
public MyPagerAdapter(Context context) {
this.mContext = context;
}
// As per docs, you may use views as key objects directly
// if they aren't too complex
@Override
public Object instantiateItem(ViewGroup container, int position) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.item, null);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public int getCount() {
return 10;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
// Important: page takes all available width by default,
// so let's override this method to fit 5 pages within single screen
@Override
public float getPageWidth(int position) {
return 0.2f;
}
}
ফলস্বরূপ, আপনি অ্যাডাপ্টারের সাথে অনুভূমিক স্ক্রোলযোগ্য উইজেট পাবেন, এটির মতো:
আমি এই সমস্যার সমাধান জন্য অনেক অনুসন্ধান করেছি। সংক্ষিপ্ত উত্তর হল, কোনও ব্যক্তিগত সমাধান ছাড়াই ব্যক্তিগত সমাধান এবং কোনও ধরণের জিনিস ছাড়াই কোনও সমাধান নেই। আমি পেয়েছিলাম সেরা জিনিস AdapterView
প্রসারিত দ্বারা স্ক্র্যাচ থেকে নিজেকে বাস্তবায়ন ছিল। এটা বেশ দু: খজনক। অনুভূমিক ListViews সম্পর্কে আমার SO প্রশ্ন দেখুন।
আমি কোনও বাহ্যিক অনুভূমিক স্ক্রলভিউ লাইব্রেরি ব্যবহার না করে এটি করার জন্য একটি যুক্তি তৈরি করেছি, এখানে আমি অনুভূমিক দৃশ্যটি অর্জন করেছি এবং আমি এখানে আমার উত্তর পোস্ট করেছি: https://.com/a/33301582/5479863
আমার জন্সন প্রতিক্রিয়া এই হল:
{"searchInfo":{"status":"1","message":"Success","clist":[{"id":"1de57434-795e-49ac-0ca3-5614dacecbd4","name":"Theater","image_url":"http://52.25.198.71/miisecretory/category_images/movie.png"},{"id":"62fe1c92-2192-2ebb-7e92-5614dacad69b","name":"CNG","image_url":"http://52.25.198.71/miisecretory/category_images/cng.png"},{"id":"8060094c-df4f-5290-7983-5614dad31677","name":"Wine-shop","image_url":"http://52.25.198.71/miisecretory/category_images/beer.png"},{"id":"888a90c4-a6b0-c2e2-6b3c-561788e973f6","name":"Chemist","image_url":"http://52.25.198.71/miisecretory/category_images/chemist.png"},{"id":"a39b4ec1-943f-b800-a671-561789a57871","name":"Food","image_url":"http://52.25.198.71/miisecretory/category_images/food.png"},{"id":"c644cc53-2fce-8cbe-0715-5614da9c765f","name":"College","image_url":"http://52.25.198.71/miisecretory/category_images/college.png"},{"id":"c71e8757-072b-1bf4-5b25-5614d980ef15","name":"Hospital","image_url":"http://52.25.198.71/miisecretory/category_images/hospital.png"},{"id":"db835491-d1d2-5467-a1a1-5614d9963c94","name":"Petrol-Pumps","image_url":"http://52.25.198.71/miisecretory/category_images/petrol.png"},{"id":"f13100ca-4052-c0f4-863a-5614d9631afb","name":"ATM","image_url":"http://52.25.198.71/miisecretory/category_images/atm.png"}]}}
লেআউট ফাইল:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="5">
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4" />
<HorizontalScrollView
android:id="@+id/horizontalScroll"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
</LinearLayout>
</HorizontalScrollView>
</LinearLayout>
ক্লাস ফাইল:
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);
for (int v = 0; v < collectionInfo.size(); v++) {
/*---------------Creating frame layout----------------------*/
FrameLayout frameLayout = new FrameLayout(ActivityMap.this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, getPixelsToDP(90));
layoutParams.rightMargin = getPixelsToDP(10);
frameLayout.setLayoutParams(layoutParams);
/*--------------end of frame layout----------------------------*/
/*---------------Creating image view----------------------*/
final ImageView imgView = new ImageView(ActivityMap.this); //create imageview dynamically
LinearLayout.LayoutParams lpImage = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
imgView.setImageBitmap(collectionInfo.get(v).getCatImage());
imgView.setLayoutParams(lpImage);
// setting ID to retrieve at later time (same as its position)
imgView.setId(v);
imgView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// getting id which is same as its position
Log.i(TAG, "Clicked on " + collectionInfo.get(v.getId()).getCatName());
// getting selected category's data list
new GetSelectedCategoryData().execute(collectionInfo.get(v.getId()).getCatID());
}
});
/*--------------end of image view----------------------------*/
/*---------------Creating Text view----------------------*/
TextView textView = new TextView(ActivityMap.this);//create textview dynamically
textView.setText(collectionInfo.get(v).getCatName());
FrameLayout.LayoutParams lpText = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.CENTER);
// Note: LinearLayout.LayoutParams 's gravity was not working so I putted Framelayout as 3 paramater is gravity itself
textView.setTextColor(Color.parseColor("#43A047"));
textView.setLayoutParams(lpText);
/*--------------end of Text view----------------------------*/
//Adding views at appropriate places
frameLayout.addView(imgView);
frameLayout.addView(textView);
linearLayout.addView(frameLayout);
}
private int getPixelsToDP(int dp) {
float scale = getResources().getDisplayMetrics().density;
int pixels = (int) (dp * scale + 0.5f);
return pixels;
}
এখানে কাজ করছে এমন কৌশলটি আইডিভিউউইউ "imgView.setId (v)" এর জন্য নির্ধারিত আইডি এবং ক্ল্লিকলাস্টারের উপর প্রয়োগ করার পরে আমি আবার ভিউটির id fetching করছি .... আমিও কোডের ভিতরে মন্তব্য করেছি এটা বুঝতে সহজ যে, আমি আশা করি এটি খুব দরকারী হতে পারে ... শুভ কোডিং ... :)
এটি একটি সামান্য (খুব) দেরী, কিন্তু আমি এই পোস্টে পোস্ট করছি পরে কেউ এই পরে।
অ্যান্ড্রয়েড এল পূর্বরূপের সাপোর্ট লাইব্রেরিতে একটি RecyclerView
ভিউ রয়েছে যা আপনি যা চান তা ঠিক করে।
এই মুহূর্তে, আপনি এটি কেবলমাত্র এল পূর্বরূপ SDK এর মাধ্যমে পেতে পারেন এবং আপনার minSdk
L
সেট করতে হবে। তবে আপনি আপনার প্রকল্পের সমস্ত প্রয়োজনীয় ফাইল অনুলিপি করতে পারেন এবং আনুষ্ঠানিকভাবে আউট না হওয়া পর্যন্ত সেভাবে সেগুলি ব্যবহার করতে পারেন।
আপনি here প্রাকদর্শন ডক্স ডাউনলোড করতে পারেন।
সতর্কতা: পুনঃব্যবহারকারীর দৃশ্যের জন্য API পরিবর্তন হতে পারে এবং এতে বাগ থাকতে পারে।
আপডেট করা হয়েছে
অনুভূমিক তালিকা দেখার জন্য উৎস কোডটি হল:
LinearLayoutManager layoutManager
= new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);
তার জন্য একটি দুর্দান্ত লাইব্রেরি রয়েছে, যাকে TwoWayView বলা TwoWayView , এটি বাস্তবায়ন করা খুব সহজ, শুধু আপনার লাইব্রেরিতে প্রকল্প লাইব্রেরিটি অন্তর্ভুক্ত করুন এবং আপনার মূল প্রকল্পে লাইব্রেরী প্রকল্প হিসাবে যোগ করুন এবং তারপরে এখানে উল্লেখিত নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করুন :
প্রথমত, একটি শৈলী যুক্ত করুন (রেজ / মান / স্টাইলস.এক্সএমএল) তালিকাভiewের অনুভূমিক (অনুভূমিক বা উল্লম্ব) নির্দেশ করে:
<style name="TwoWayView">
<item name="android:orientation">horizontal</item>
</style>
তারপর,
আপনার লেআউট এক্সএমএল, দুটি কোড যুক্ত করতে নিম্নলিখিত কোডটি ব্যবহার করুন:
<org.lucasr.twowayview.TwoWayView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/lvItems"
style="@style/TwoWayView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:drawSelectorOnTop="false"
tools:context=".MainActivity" />
এবং অবশেষে, শুধু এটি ঘোষণা করুন এবং এটির সাথে নিয়মিত ListView
মত আচরণ করুন:
TwoWayView lvTest = (TwoWayView) findViewById(R.id.lvItems);
তালিকা ListView
সমস্ত পদ্ধতিগুলি স্বাভাবিক হিসাবে এখানে কাজ করবে, তবে আমি লক্ষ্য করেছি যে শুধুমাত্র একটি পার্থক্য রয়েছে, যা পছন্দ মোড সেটিং করার সময়, পদ্ধতি সেট setChoiceMode
কোন int
মান নেয় না তবে ChoiceMode
নামে ChoiceMode
একটি মান, তাই list_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE
হবে lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE
lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE
।
ভাল আপনি সবসময় আপনার textviews ইত্যাদি তৈরি করতে পারেন গতিশীলভাবে এবং আপনার onclicklisteners সেট করুন যেমন আপনি একটি অ্যাডাপ্টারের সাথে করবেন
যেহেতু Google এন্ড্রয়েড সাপোর্ট লাইব্রেরি v7 21.0.0 চালু করেছে, তাই আপনি অনুভূমিকভাবে আইটেমগুলি স্ক্রোল করতে পুনর্ব্যবহারযোগ্য ব্যবহার করতে পারেন। RecyclerView উইজেট ListView এর একটি আরও উন্নত এবং নমনীয় সংস্করণ।
RecyclerView ব্যবহার করতে, নির্ভরতা যোগ করুন:
com.android.support:recyclerview-v7:23.0.1
এখানে একটি নমুনা:
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(layoutManager);
MyAdapter adapter = new MyAdapter(myDataset);
recyclerView.setAdapter(adapter);
}
}
RecyclerView সম্পর্কে আরও তথ্য:
তার আসলে খুব সহজ : সহজভাবে তার পাশে রাখা তালিকা ভিউ ঘোরান
mlistView.setRotation(-90);
তারপর শিশুদের inflating উপর, GetView পদ্ধতি ভিতরে যে হওয়া উচিত। আপনি সরাসরি দাঁড়ানো শিশুদের ঘোরান:
mylistViewchild.setRotation(90);
সম্পাদনা করুন: যদি আপনার তালিকা RotateLayout ঘূর্ণন পরে সঠিকভাবে ফিট না হয় তবে এই RotateLayout ভিতরে তালিকা RotateLayout এটিকে রাখুন:
<com.github.rongi.rotate_layout.layout.RotateLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:angle="90"> <!-- Specify rotate angle here -->
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</com.github.rongi.rotate_layout.layout.RotateLayout>