PDA

View Full Version : کلیک روی آیتم های لیست ویوی افقی



fa.mk244
شنبه 17 آبان 1393, 15:48 عصر
سلام
من از کد های زیر برای ساخت لیست ویو افقی استفاده کردم و درست هم کار میکنه
فقط میخوام برای هر باتن توی لیست یه کد onclick مخصوص خودش رو داشته باشم
باید چه تغییری بدم؟

viewitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#fff"
>


<ImageButton
android:id="@+id/image"
android:layout_width="100dip"
android:layout_height="115dip"
android:scaleType="centerCrop"
android:src="@drawable/rr" />

</LinearLayout>



main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/bg"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg" >


<LinearLayout
android:id="@+id/top"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="@drawable/top"
android:orientation="vertical" >



<com.example.app.HorizontalListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_marginTop="8dp"
android:layout_height="125sp"
android:background="#ddd" />




</LinearLayout>


<LinearLayout
android:id="@+id/dw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:background="@drawable/bgd"
android:orientation="vertical" >
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:background="@drawable/left" >
</LinearLayout>


<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/right" >
</LinearLayout>


<LinearLayout
android:id="@+id/down"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/down"
android:layout_alignParentLeft="true"
android:orientation="vertical" >
</LinearLayout>
</RelativeLayout>




HorizontalListView.java

public class HorizontalListView extends AdapterView<ListAdapter> {


public boolean mAlwaysOverrideTouch = true;
protected ListAdapter mAdapter;
private int mLeftViewIndex = -1;
private int mRightViewIndex = 0;
protected int mCurrentX;
protected int mNextX;
private int mMaxX = Integer.MAX_VALUE;
private int mDisplayOffset = 0;
protected Scroller mScroller;
private GestureDetector mGesture;
private Queue<View> mRemovedViewQueue = new LinkedList<View>();
private OnItemSelectedListener mOnItemSelected;
private OnItemClickListener mOnItemClicked;

public HorizontalListView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}

private void initView() {
mLeftViewIndex = -1;
mRightViewIndex = 0;
mDisplayOffset = 0;
mCurrentX = 0;
mNextX = 0;
mMaxX = Integer.MAX_VALUE;
mScroller = new Scroller(getContext());
mGesture = new GestureDetector(getContext(), mOnGesture);
}

@Override
public void setOnItemSelectedListener(AdapterView.OnItemSelect edListener listener) {
mOnItemSelected = listener;
Log.v("log_tag", "Message is set On Clicked");
}

@Override
public void setOnItemClickListener(AdapterView.OnItemClickList ener listener){
mOnItemClicked = listener;
Log.v("log_tag", "Set on Item Clicked");
}


private DataSetObserver mDataObserver = new DataSetObserver() {


@Override
public void onChanged() {
// TODO Auto-generated method stub
super.onChanged();
}


@Override
public void onInvalidated() {
// TODO Auto-generated method stub
super.onInvalidated();
}
};


@Override
public ListAdapter getAdapter() {
return mAdapter;
}


@Override
public View getSelectedView() {
//TODO: implement
return null;
}


@Override
public void setAdapter(ListAdapter adapter) {
if(mAdapter != null) {
mAdapter.unregisterDataSetObserver(mDataObserver);
}
mAdapter = adapter;
mAdapter.registerDataSetObserver(mDataObserver);
initView();
removeAllViewsInLayout();
requestLayout();
}


@Override
public void setSelection(int position) {
//TODO: implement
}

private void addAndMeasureChild(final View child, int viewPos) {
LayoutParams params = child.getLayoutParams();
if(params == null) {
params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
}

addViewInLayout(child, viewPos, params, true);
child.measure(MeasureSpec.makeMeasureSpec(getWidth (), MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));
}


@Override
protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);

if(mAdapter == null){
return;
}
if(mScroller.computeScrollOffset()){
int scrollx = mScroller.getCurrX();
mNextX = scrollx;
}
if(mNextX < 0){
mNextX = 0;
mScroller.forceFinished(true);
}
if(mNextX > mMaxX) {
mNextX = mMaxX;
mScroller.forceFinished(true);
}
int dx = mCurrentX - mNextX;
removeNonVisibleItems(dx);
fillList(dx);
positionItems(dx);
mCurrentX = mNextX;

if(!mScroller.isFinished()){
post(new Runnable(){
@Override
public void run() {
requestLayout();
}
});

}
}

private void fillList(final int dx) {
int edge = 0;
View child = getChildAt(getChildCount()-1);
if(child != null) {
edge = child.getRight();
}
fillListRight(edge, dx);
edge = 0;
child = getChildAt(0);
if(child != null) {
edge = child.getLeft();
}
fillListLeft(edge, dx);
}

private void fillListRight(int rightEdge, final int dx) {
while(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) {
View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this);
addAndMeasureChild(child, -1);
rightEdge += child.getMeasuredWidth();
if(mRightViewIndex == mAdapter.getCount()-1){
mMaxX = mCurrentX + rightEdge - getWidth();
}
mRightViewIndex++;
}
}

private void fillListLeft(int leftEdge, final int dx) {
while(leftEdge + dx > 0 && mLeftViewIndex >= 0) {
View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this);
addAndMeasureChild(child, 0);
leftEdge -= child.getMeasuredWidth();
mLeftViewIndex--;
mDisplayOffset -= child.getMeasuredWidth();
}
}

private void removeNonVisibleItems(final int dx) {
View child = getChildAt(0);
while(child != null && child.getRight() + dx <= 0) {
mDisplayOffset += child.getMeasuredWidth();
mRemovedViewQueue.offer(child);
removeViewInLayout(child);
mLeftViewIndex++;
child = getChildAt(0);
}
child = getChildAt(getChildCount()-1);
while(child != null && child.getLeft() + dx >= getWidth()) {
mRemovedViewQueue.offer(child);
removeViewInLayout(child);
mRightViewIndex--;
child = getChildAt(getChildCount()-1);
}
}

private void positionItems(final int dx) {
if(getChildCount() > 0){
mDisplayOffset += dx;
int left = mDisplayOffset;
for(int i=0;i<getChildCount();i++){
View child = getChildAt(i);
int childWidth = child.getMeasuredWidth();
child.layout(left, 0, left + childWidth, child.getMeasuredHeight());
left += childWidth;
}
}
}

public synchronized void scrollTo(int x) {
mScroller.startScroll(mNextX, 0, x - mNextX, 0);
requestLayout();
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean handled = mGesture.onTouchEvent(ev);
return handled;
}

protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
synchronized(HorizontalListView.this){
mScroller.fling(mNextX, 0, (int)-velocityX, 0, 0, mMaxX, 0, 0);
}
requestLayout();
return true;
}

protected boolean onDown(MotionEvent e) {
mScroller.forceFinished(true);
return true;
}

private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() {


@Override
public boolean onDown(MotionEvent e) {
return HorizontalListView.this.onDown(e);
}


@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return HorizontalListView.this.onFling(e1, e2, velocityX, velocityY);
}


@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
synchronized(HorizontalListView.this){
mNextX += (int)distanceX;
}
requestLayout();
return true;
}


@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Rect viewRect = new Rect();
for(int i=0;i<getChildCount();i++){
View child = getChildAt(i);
int left = child.getLeft();
int right = child.getRight();
int top = child.getTop();
int bottom = child.getBottom();
viewRect.set(left, top, right, bottom);
if(viewRect.contains((int)e.getX(), (int)e.getY())){
if(mOnItemClicked != null){
mOnItemClicked.onItemClick(HorizontalListView.this , child, mLeftViewIndex + 1 + i, 0);
}
if(mOnItemSelected != null){
mOnItemSelected.onItemSelected(HorizontalListView. this, child, mLeftViewIndex + 1 + i, 0);
}
break;
}
}
return true;
}
};
}



Main.java

public class Main extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

HorizontalListView listview = (HorizontalListView) findViewById(R.id.listview);
listview.setAdapter(mAdapter);
private static String[] dataObjects = new String[]{ "#1", "#2", "#3", "#4" };

private BaseAdapter mAdapter = new BaseAdapter() {



private OnClickListener mOnButtonClicked = new OnClickListener() {

@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(Main.this);
builder.setMessage("hello from " + v);
builder.setPositiveButton("Cool", null);
builder.show();

}
};

@Override
public int getCount() {
return dataObjects.length;
}


@Override
public Object getItem(int position) {
return null;
}


@Override
public long getItemId(int position) {
return 0;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
View retval = LayoutInflater.from(parent.getContext()).inflate(R .layout.viewitem, null);
ImageButton button = (ImageButton) retval.findViewById(R.id.image);
button.setOnClickListener(mOnButtonClicked);
return retval;
}
};

fa.mk244
شنبه 17 آبان 1393, 22:29 عصر
کسی نیست اینجا

tux-world
یک شنبه 18 آبان 1393, 11:17 صبح
منظورت رو من درست متوجه نشدم فکر کنم. یعنی میگی که تو هر سطر که باتن تعریف کردی لیسنر خودش رو داشته باشه؟ مثلا اگه ۱۰ تا باتن داری هر کودوم یه کار مجزایی انجام بده درسته؟ خوب اگه اینطوریه که میتونی از پرنت اون استفاده کنی آیدیشو بگیری هر کاری بلایی خواستی سرش بیار مثل همین کدی که نوشتم :قهقهه:



View parent = (View) textViewThatWasClicked.getParent();
if (parent != null) {
TextView textViewThatYouWantToChange = parent.findViewById(R.id.textViewThatYouWantToChan ge);
textViewThatYouWantToChange.setText(...);
}