2017-01-21 7 views
0

RelativelayoutにOnTouchListenerを設定したいのですが、これはarrayadapterによって作成され、listviewに送信されます。しかし、OnTouchListenerによってトリガーされるコードは、アダプターが設定されているアクティビティーに書き込まれなければなりません。リスナーをアダプターのビューに設定し、それをアクティビティーで定義(またはコード化)することは可能ですか?アダプタでOnTouchListenerを設定し、アダプタが設定されているアクティビティから呼び出すことはできますか?

マイアダプタ:

public class MessageAdapter extends ArrayAdapter<FriendlyMessage> { 

TouchInterface touchInterface; 
protected AlphaAnimation fadeOut = new AlphaAnimation(1.0f , 0.0f); 
protected AlphaAnimation fadeIn = new AlphaAnimation(0.0f , 1.0f); 
ViewHolder viewHolder = new ViewHolder(); 

private static class ViewHolder { 
    TextView messageText; 
    TextView nameText; 
    TextView timeText; 
    ImageView imageView; 
    RelativeLayout relativeLayout; 
    int position; 
} 

public MessageAdapter(Context context, int resource, List<FriendlyMessage> objects) { 
    super(context, resource, objects); 
} 

public void setOnTouchListener(View.OnTouchListener touchListener){ 
    this.touchInterface = (TouchInterface) touchListener; 
    viewHolder.relativeLayout.setOnTouchListener(touchListener); 
} 

@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 

    FriendlyMessage message = getItem(position); 

    if (message.getPhotoUrl() != null){ 
     if (Objects.equals(message.getKey(), String.valueOf(Build.SERIAL))){ 
      convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_image_right, null); 
      viewHolder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.rel); 
      viewHolder.imageView = (ImageView) convertView.findViewById(R.id.photoImageViewR); 
      viewHolder.nameText = (TextView) convertView.findViewById(R.id.nameTextView); 
      viewHolder.timeText = (TextView) convertView.findViewById(R.id.tvtimeimg); 
      Picasso.with(viewHolder.imageView.getContext()) 
        .load(message.getPhotoUrl()) 
        .into(viewHolder.imageView); 
      convertView.setTag(viewHolder); 
     } 
     else if (!Objects.equals(message.getKey(), String.valueOf(Build.SERIAL))){ 
      convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_image_left, null); 
      viewHolder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.rel); 
      viewHolder.imageView = (ImageView) convertView.findViewById(R.id.photoImageViewL); 
      viewHolder.nameText = (TextView) convertView.findViewById(R.id.nameTextView); 
      viewHolder.timeText = (TextView) convertView.findViewById(R.id.tvtimeimg); 
      Picasso.with(viewHolder.imageView.getContext()) 
        .load(message.getPhotoUrl()) 
        .into(viewHolder.imageView); 
      convertView.setTag(viewHolder); 
     } 
    } 
    else if (message.getPhotoUrl() == null){ 
     if (Objects.equals(message.getKey(), String.valueOf(Build.SERIAL))) { 
      convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_text_right, null); 
      viewHolder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.rel); 
      viewHolder.messageText = (TextView) convertView.findViewById(R.id.messageTextView); 
      viewHolder.nameText = (TextView) convertView.findViewById(R.id.nameTextView); 
      viewHolder.timeText = (TextView) convertView.findViewById(R.id.tvtime); 
      viewHolder.messageText.setText(message.getText()); 
      convertView.setTag(viewHolder); 

     } else if (!Objects.equals(message.getKey(), String.valueOf(Build.SERIAL))) { 
      convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_text_left, null); 
      viewHolder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.rel); 
      viewHolder.messageText = (TextView) convertView.findViewById(R.id.messageTextView); 
      viewHolder.nameText = (TextView) convertView.findViewById(R.id.nameTextView); 
      viewHolder.timeText = (TextView) convertView.findViewById(R.id.tvtime); 
      viewHolder.messageText.setText(message.getText()); 
      convertView.setTag(viewHolder); 
     } 
    } 
//some other code here 
    return convertView; 
}} 

TouchInterface:

public interface TouchInterface { 
void touch(View.OnTouchListener onTouchListener);} 

そして、私の活動、私はリスナー(その長いコードを、呼び出したいので、私は今、重要でないいくつかの部分を、削除):

public class MessageActivity extends AppCompatActivity implements TouchInterface{ 

private static final String TAG = "MessageActivity"; 

public static final String ANONYMOUS = "anonymous"; 
public static final int DEFAULT_MSG_LENGTH_LIMIT = 1000; 
public static final int RC_SIGN_IN = 1; 
private static final int RC_PHOTO_PICKER = 2; 

private ListView mMessageListView; 
private MessageAdapter mMessageAdapter; 
private ProgressBar mProgressBar; 
private ImageButton mPhotoPickerButton; 
private EditText mMessageEditText; 
private Button mSendButton; 
private FirebaseDatabase mFirebaseDatabase; 
private DatabaseReference mMessagesDatabaseReference; 
private static DatabaseReference mMessagesDatabaseReference2; 
private ChildEventListener mChildEventListener; 
private FirebaseAuth mFirebaseAuth; 
private FirebaseAuth.AuthStateListener mAuthStateListener; 
private FirebaseStorage mFirebaseStorage; 
private StorageReference mStorageReference; 

private String mUsername; 
private Toolbar toolbar; 
private String key = Build.SERIAL; 

private SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd"); 
private SimpleDateFormat sdft = new SimpleDateFormat("HH:mm"); 
private String time = sdft.format(new Date()); 
private String date = sdf.format(new Date()); 

public View.OnTouchListener listener; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_message); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    assert toolbar != null; 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 


    mUsername = ANONYMOUS; 

    mFirebaseDatabase = FirebaseDatabase.getInstance(); 
    mFirebaseAuth = FirebaseAuth.getInstance(); 
    mMessagesDatabaseReference = mFirebaseDatabase.getReference().child("messages"); 
    mMessagesDatabaseReference2 = mFirebaseDatabase.getReference().child("touches"); 
    mFirebaseStorage = FirebaseStorage.getInstance(); 
    mStorageReference = mFirebaseStorage.getReference().child("photos"); 

    // Initialize references to views 
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar); 
    mMessageListView = (ListView) findViewById(R.id.messageListView); 
    mPhotoPickerButton = (ImageButton) findViewById(R.id.photoPickerButton); 
    mMessageEditText = (EditText) findViewById(R.id.messageEditText); 
    mSendButton = (Button) findViewById(R.id.sendButton); 

    // Initialize message ListView and its adapter 
    List<FriendlyMessage> friendlyMessages = new ArrayList<>(); 

    mMessageAdapter = new MessageAdapter(this, 0, friendlyMessages); 
    mMessageListView.setAdapter(mMessageAdapter); 
    mMessageAdapter.setOnTouchListener(listener); 
//some other code here 
} 
//some other code here 
@Override 
public void touch(View.OnTouchListener listener1) { 
    this.listener = listener1; 
    Log.i(TAG, "touched"); 
    listener = new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      int x = (int) event.getX(); 
      int y = (int) event.getY(); 

      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        Log.i("TAG", "touched down"); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        Log.i("TAG", "moving: (" + x + ", " + y + ")"); 
        break; 
       case MotionEvent.ACTION_UP: 
        Log.i("TAG", "touched up"); 
        break; 
      } 

      mMessagesDatabaseReference2.push().setValue(x, y); 

      return false; 
     } 
    }; 
}} 
+1

ような何かをしなければならない項目を設定する必要がありますリスナーをListViewでアクティビティ –

+0

から試してみましたが、これも試しましたが、リストビューでリスナーを設定すると、スワイプするとスクロールがバギーになりますわずか10 dp移動します。 – DaGee

+0

あなたのコードを表示してください。 –

答えて

0

あなたが正しく質問していることを理解している場合は、リストeにクリックリスナーを設定する親アクティビティのメソッドを実行してください(それぞれのパラメータを渡すと思います)。正しく取得した場合は、Adapterクラスの親アクティビティタイプの変数を定義する必要があります。あなたのAdapterコンストラクタで、その後

private MessageActivity activity; 

activity = (MessageActivity) context; 

ような何かそして、あなたはビューであなたのクリックのリスナーを設定するとき、あなたは

view.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // Perform action on click 
      activity.YourOnTouchMethodImplementation(); 
     } 
    }); 
+0

ありがとうございました。それは私の問題を解決しました:) – DaGee

+0

あなたは大歓迎です:)!正直言って、それを行うには建築レベルではるかに良い方法があり、私は次の朝起きたときに私はこの答えを書いたと思った:P。あなたがコードを実行したいアクティビティにTouchInterfaceを実装していて、このコードがこのインターフェースに実装されているので、 'Context'をキャストする代わりに、' TouchInterface touchInterface'のような余分な変数をアダプタのコンストラクタに渡すことができます特定のタイプの 'Activity'として、' touchInterface.Touch(); 'をクリックしてあなたの上に書くだけです。あなたがそれを試してみる時間があれば、はるかに良い解決策です。 –

+0

私はこれにコードを変更すると思う、それは私のために簡単に見える、ありがとうもう一度:) – DaGee

関連する問題