ایجاد روال کلیک برای آیتمی از ListView ای که به صورت Fragment در یکی از Tab های ViewPager قرار دارد
کلیت موضوع از عنوان مشخصه. اگر راه حل عمومی دارد هم لطفا ارائه کنید.
خوب شرح واقعه: (لینک سورس ها در آخر سوال اضافه شد)
من یک نمونه برنامه دانلود و به عنوان پروژه وارد کردم. (اگر لازم دانستید بگید سورس بگذارم) این پروژه به این صورت است که ما یک صفحه اصلی داریم (main_layout) که در داخل آن چند عدد تب به صورت ViewPager قرار دارد. و در هر کدام از این تب ها هم یک لیست ویو (fragment_list) قرار دارد. آیتم های این لیست ویو از لی اوتی به نام test ایجاد می شوند که در آن کلیدی به نام btnItem قرار داده شده است. حالا من می خواهم به این کلید (یا حتی کل آیتم لیست ویو) یک روال اختصاص بدهم که در صورت کلیک شدن یک log ایجاد کند.
حالا جزئیات کدها: (بخش های غیر ضروری حذف شده اند)
کدهای MainActivity
public class MainActivity extends ActionBarActivity implements ScrollTabHolder,
ViewPager.OnPageChangeListener {
//تعریف متغیرها حذف شده است.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//کدهای متفرقه حذف شده است
@Override
public Fragment getItem(int position) {
ScrollTabHolderFragment fragment;
fragment = (ScrollTabHolderFragment) SampleListFragment.newInstance(position);
mScrollTabHolders.put(position, fragment);
return fragment;
}
کدهای کلاس fragment:
public class HamedSampleListFragment extends ScrollTabHolderFragment
implements OnScrollListener { private static final String ARG_POSITION = "position"; private ListView mListView; private ArrayList mListItems; private int mPosition; View v; static Button btnItem; public static Fragment newInstance(int position) { HamedSampleListFragment f = new HamedSampleListFragment(); Bundle b = new Bundle(); b.putInt(ARG_POSITION, position); f.setArguments(b); Log.i("log", "tab in main" + position); return f; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPosition = getArguments().getInt(ARG_POSITION); mListItems = new ArrayList(); for (int i = 1; i <= 1; i++) { mListItems.add(i + ". item - currnet page: " + (mPosition + 1)); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_list, null);
// این بخش از کد را برای این اضافه کردم تا بتونم کلید را تعریف کنم که احتمالا
// راه اشتباهی انتخاب کردم چون هرچند در لاگ زیر تونستم تکست را بگیرم ولی در ادامه روال کلیک جاب نمی دهد //******************* View view = inflater.inflate(R.layout.test, null); Log.i("log", "test step 2"); btnItem = (Button) view.findViewById(R.id.btnItem); Log.i("log", "button text : " + btnItem.getText().toString()); //جایی که باید روال کلیک جواب می داد ولی نمی دهد
btnItem.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Log.i("log", "test step 3"); } });
//************************
mListView = (ListView) v.findViewById(R.id.listView); View placeHolderView = inflater.inflate(R.layout.view_header_placeholder, mListView, false); mListView.addHeaderView(placeHolderView); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mListView.setOnScrollListener(this); mListView.setAdapter(new ArrayAdapter(getActivity(), R.layout.test, R.id.text11, mListItems)); } @Override public void adjustScroll(int scrollHeight) { if (scrollHeight == 0 && mListView.getFirstVisiblePosition() >= 1) { return; } mListView.setSelectionFromTop(1, scrollHeight); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (mScrollTabHolder != null) mScrollTabHolder.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount, mPosition); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // nothing } }
یک کلاس و اینترفیس رابط هم وجود دارد:
اولی : ScrollTabHolder
package com.kmshack.newsstand;
import android.widget.AbsListView;
public interface ScrollTabHolder {
void adjustScroll(int scrollHeight);
void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount, int pagePosition);
}
دومی: ScrollTabHolderFragment
package com.kmshack.newsstand;
import android.support.v4.app.Fragment;
import android.widget.AbsListView;
public abstract class ScrollTabHolderFragment extends Fragment implements ScrollTabHolder {
protected ScrollTabHolder mScrollTabHolder;
public void setScrollTabHolder(ScrollTabHolder scrollTabHolder) {
mScrollTabHolder = scrollTabHolder;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount, int pagePosition) {
// nothing
}
}
با تشکر از وقتی که می گذارید.
خوب این هم سورس ها:
1- سورس خود پروژه: ParallaxHeaderViewPager که از اینجا ایمپورت شده و تغییراتی در ان داده شده است.
2- اندروید ساپورت ورژن هفت که نیازه: لینک
3- کتابخانه nineoldandroid: لینک
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .